Java で LINUX ディレクトリとファイルを読み取り、Windows 共有フォルダーを読み取るための詳細な方法
最近、企業のニーズにより、Java は Windows 上のデバイス共有フォルダーを読み取る必要がありますが、最終コードは Linux に配置する必要があります。そのため、Windows上で開発したコードが有効にならないという問題があります。最後にWindowsの共有フォルダをLinux上にマウントした後、読み込みプログラムを書き換えて機能を実現します。インターネットで関連情報を検索しましたが、あまり包括的ではなかったので、皆さんのお役に立てればと思い、関連するコードを共有します。
依存関係は次のとおりです。
<dependencies>
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.1</version>
</dependency>
</dependencies>
1. Windows の共有フォルダー内のすべてのファイルを読み取ります。
@Resource
private MaterialsService materialsService;
@Resource
private PurchaseOrderService purchaseOrderService;
private static String USER_DOMAIN = ""; //域账号,没有可以不填
private static String USER_ACCOUNT = "Equator"; //账号
private static String USER_PWS = "equator"; //密码
private static String SOURCE_URL = "smb://192.168.20.160/SQLBinaryData0140/gong_xiang_bao_gao/";//来源路径
private static String TARGET_URL = "\\\\192.168.20.160\\SQLBinaryData0140\\ExamineItemByTestingEquipmentBak\\";//处理后转移路径
/**
* @Title listFiles
* @Description 遍历指定目录下的文件(共享文件夹)
* @author Created by Chen Yang
* @date 2021-07-19
*/
public void listFiles(String shareDirectory) throws Exception {
long startTime = System.currentTimeMillis();
// 域服务器验证
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(USER_DOMAIN, USER_ACCOUNT, USER_PWS);
SmbFile remoteFile = new SmbFile(shareDirectory, auth);
//System.out.println("远程共享目录访问耗时:【{}】" + (System.currentTimeMillis() - startTime));
if (remoteFile.exists()) {
SmbFile[] files = remoteFile.listFiles();
//System.out.println("文件存在");
for (SmbFile f : files) {
//System.out.println(f.getName());
if(f.getName().indexOf(".txt") > -1 || f.getName().indexOf(".TXT") > -1 ){
File file = new File(f.getUncPath());
//System.out.println(f.getUncPath());
ArrayList<ExamineByTestingEquipment> testCardItemMapList = txt2String(file);
if(CollUtil.isNotEmpty(testCardItemMapList)){
this.insertBatch(testCardItemMapList);
//System.out.println(testCardItemMapList);
}
File targetFile = new File(new String((TARGET_URL+f.getName().toString()).getBytes("utf-8"),"utf-8"));
boolean result = removeFile(file,targetFile);
if (!result) {
throw new CswRuntimeException("文件移动失败!");
}
}
}
} else {
throw new CswRuntimeException("目录下无文件!");
}
}
2. Linux 上の共有フォルダー内のすべてのファイルを読み取ります。
@Resource
private MaterialsService materialsService;
@Resource
private PurchaseOrderService purchaseOrderService;
private static String USER_DOMAIN = ""; //域账号,没有可以不填
private static String USER_ACCOUNT = "Equator"; //账号
private static String USER_PWS = "equator"; //密码
private static String SOURCE_URL = "/share/gong_xiang_bao_gao/";//来源路径
private static String TARGET_URL = "/share/ExamineItemByTestingEquipmentBak/";//处理后转移路径
/**
* @Title queryLinuxFileNames
* @Description 遍历指定目录下的文件(LNIUX下)
* @author Created by Chen Yang
* @date 2021-07-19
*/
public void queryLinuxFileNames(String path) throws Exception {
File linuxFile=new File(path);
if(linuxFile.exists()){
File[] tempList = linuxFile.listFiles();
System.out.println("该目录下对象个数:"+tempList.length);
for(File f: tempList){
if(f.getName().indexOf(".txt") > -1 || f.getName().indexOf(".TXT") > -1 ){
File file = new File(f.toString());
//System.out.println(f.getUncPath());
ArrayList<ExamineByTestingEquipment> testCardItemMapList = txt2String(file);
if(CollUtil.isNotEmpty(testCardItemMapList)){
this.insertBatch(testCardItemMapList);
//System.out.println(testCardItemMapList);
}
File targetFile = new File(TARGET_URL+f.getName().toString());
boolean result = removeFile2(file,targetFile);
if (!result) {
System.out.println("文件移动失败!");
}
}
}
}else{
System.out.println("目录下无文件!");
}
}
3. ファイル読み込みを実装する
/**
* 读取txt文件的内容
* @param file 想要读取的文件对象
* @author Created by Chen Yang
* @return 返回文件内容
*/
public ArrayList<ExamineByTestingEquipment> txt2String(File file){
ArrayList<ExamineByTestingEquipment> testCardItemMapList = new ArrayList<ExamineByTestingEquipment>();
String testCardItemnum = null;
String itemCode = null;
String poOrder = null;
boolean flag = false;
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
int i = 0;
ExamineByTestingEquipment examineByTestingEquipment;
Materials materials;
PurchaseOrder purchaseOrder;
while((s = br.readLine())!=null){
//使用readLine方法,一次读一行
if(flag && s.indexOf("#") == -1){
if((s.split("\\s+").length > 1 && s.indexOf("TruePosition2D") > -1) ||
(s.split("\\s+").length > 1 && s.indexOf("Perpendicular") > -1)){
examineByTestingEquipment = new ExamineByTestingEquipment();
materials = new Materials();
purchaseOrder = new PurchaseOrder();
materials.setCode(itemCode);
purchaseOrder.setCode(poOrder);
if(materialsService.getMaterials(materials) == null || purchaseOrderService.getPurchaseOrder(purchaseOrder) == null ){
continue;
}
examineByTestingEquipment.setId(IdWorker.getId());
examineByTestingEquipment.setMaterials(materials);
examineByTestingEquipment.setMaterialsId(materialsService.getMaterials(materials).getId());
examineByTestingEquipment.setPurchaseOrder(purchaseOrder);
examineByTestingEquipment.setPurchaseOrderId(purchaseOrderService.getPurchaseOrder(purchaseOrder).getId());
examineByTestingEquipment.setExamineNum(Integer.parseInt(testCardItemnum));
examineByTestingEquipment.setExamineName(s.split("\\s+")[0]);
examineByTestingEquipment.setExamineValue(s.split("\\s+")[1]);
examineByTestingEquipment.setVersion(examineByTestingEquipment.getVersion());
examineByTestingEquipment.setCreateUser("admin");
examineByTestingEquipment.setCreateUserId(Long.parseLong("1196980511038091266"));
examineByTestingEquipment.setGmtCreate(new Date());
examineByTestingEquipment.setModifiedUser("admin");
examineByTestingEquipment.setGmtModified(new Date());
testCardItemMapList.add(examineByTestingEquipment);
}
}else{
flag = false;
}
if (s.indexOf("#") > -1 && !flag){
flag = true;
testCardItemnum = s.substring(1);
}
if(i == 5){
itemCode = s.trim();
}
if(i == 6){
poOrder = s.trim();
}
i += 1;
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
//System.out.println(testCardItemMapList);
return testCardItemMapList;
}
4. 読み取ったファイルを別のディレクトリに配置します。
方法 1:
/**
* 移动文件到另一个目录
*/
public boolean removeFile(File sourceFile, File targetFile){
boolean result = sourceFile.renameTo(targetFile);
return result;
}
方法 2:
/**
* 移动文件到另一个目录
*/
public boolean removeFile2(File sourceFile, File targetFile){
boolean result = false;
FileInputStream in = null;
FileOutputStream out = null;
try {
//复制原文件
BufferedReader br = new BufferedReader(new FileReader(sourceFile));//构造一个BufferedReader类来读取文件
BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile));
String s = null;
while((s = br.readLine())!=null){
bw.write(s);
bw.newLine();
}
// 关闭流
bw.close();
br.close();
//删除原文件
if (sourceFile.exists() && targetFile.exists()) {
result = sourceFile.delete();
}
} catch (IOException e) {
e.printStackTrace();
}
//System.out.println(result);
return result;
}