/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package datei.steuern; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author s.watson */ public class FileTools { public FileTools() { } /** * formatPath 转义文件目录 * * @param path * @return */ public static String formatPath(String path) { return path.replaceAll("\\\\", "/"); } /** * combainPath文件路径合并 * * @param eins * @param zwei * @return */ private static String combainPath(String eins, String zwei) { String dori = ""; eins = null == eins ? "" : formatPath(eins); zwei = null == zwei ? "" : formatPath(zwei); if (!eins.endsWith("/") && zwei.indexOf("/") != 0) { dori = eins + "/" + zwei; } else { dori = (eins + zwei).replaceAll("//", "/"); } return dori; } /** * list2Array 列表转换数组 * * @param list * @return */ private static String[] list2Array(List list) { String array[] = (String[]) list.toArray(new String[list.size()]); return array; } /** * cp 复制文件 * * @param source * @param destination * @param loop * @return */ public static List<File> cp(String source, String destination, boolean loop) { List<File> list = new ArrayList(); try { File srcFile = new File(source); File desFile = new File(destination); list.addAll(cp(srcFile, desFile, loop)); } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * cp 复制文件 * * @param source * @param destination * @param loop * @return */ public static List<File> cp(File source, File destination, boolean loop) { List<File> list = new ArrayList(); try { if (!source.exists() || source.isDirectory()) { throw new FileNotFoundException(); } list.add(cp(source, destination)); if (loop) { String[] subFile = source.list(); for (String subPath : subFile) { String src = combainPath(source.getPath(), subPath);//子文件原文件路径 String des = combainPath(destination.getPath(), subPath);//子文件目标路径 File subfile = new File(src); if (subfile.isFile()) { list.add(cp(src, des)); } else if (subfile.isDirectory() && loop) { list.addAll(cp(src, des, loop)); } } } } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * cp 单文件复制文件 * * @param source * @param destination * @return */ public static File cp(String source, String destination) { File desFile = null; try { File srcFile = new File(source); desFile = new File(destination); desFile = cp(srcFile, desFile); } catch (Exception ex) { j2log(null, null, ex); } return desFile; } /** * cp 单文件复制文件 * * @param source * @param destination * @return */ public static File cp(File source, File destination) { FileInputStream in = null; FileOutputStream out = null; FileChannel inc = null; FileChannel outc = null; try { if (!source.exists() || source.isDirectory()) { throw new FileNotFoundException(); } if (source.getPath().equals(destination.getPath())) { return source; } long allbytes = du(source, false); if (!destination.exists()) { destination.createNewFile(); } in = new FileInputStream(source.getPath()); out = new FileOutputStream(destination); inc = in.getChannel(); outc = out.getChannel(); ByteBuffer byteBuffer = null; long length = 2097152;//基本大小,默认2M long _2M = 2097152; while (inc.position() < inc.size()) { if (allbytes > (64 * length)) {//如果文件大小大于128M 缓存改为64M length = 32 * _2M; } else if (allbytes > (32 * length)) {//如果文件大小大于64M 缓存改为32M length = 16 * _2M; } else if (allbytes > (16 * length)) {//如果文件大小大于32M 缓存改为16M length = 8 * _2M; } else if (allbytes > (8 * length)) {//如果文件大小大于16M 缓存改为8M length = 4 * _2M; } else if (allbytes > (4 * length)) {//如果文件大小大于8M 缓存改为4M length = 2 * _2M; } else if (allbytes > (2 * length)) {//如果文件大小大于4M 缓存改为2M length = _2M; } else if (allbytes > (length)) {//如果文件大小大于2M 缓存改为1M length = _2M / 2; } else if (allbytes < length) {//如果文件小于基本大小,直接输出 length = allbytes; } allbytes = inc.size() - inc.position(); byteBuffer = ByteBuffer.allocateDirect((int) length); inc.read(byteBuffer); byteBuffer.flip(); outc.write(byteBuffer); outc.force(false); } } catch (Exception ex) { j2log(null, null, ex); } finally { try { if (null != inc) { inc.close(); } if (null != outc) { outc.close(); } if (null != in) { in.close(); } if (null != out) { out.close(); } } catch (Exception ex) { j2log(null, null, ex); } } return destination; } /** * rename 文件重命名 * * @param filePath * @param from * @param to * @return */ public static File rename(String filePath, String from, String to) { File newFile = null; try { File oldFile = new File(combainPath(filePath, from)); newFile = new File(combainPath(filePath, to)); rename(newFile, oldFile); } catch (Exception ex) { j2log(null, null, ex); } return newFile; } /** * rename 文件重命名 * * @param to * @param from * @return */ public static File rename(File from, File to) { try { String newPath = to.getPath(); String oldPath = from.getPath(); if (!oldPath.equals(newPath)) { if (!to.exists()) { from.renameTo(to); } } } catch (Exception ex) { j2log(null, null, ex); } return to; } /** * mv 移动文件 * * @param fileName * @param source * @param destination * @param cover */ public static void mv(String fileName, String source, String destination, boolean cover) { try { if (!source.equals(destination)) { File oldFile = new File(combainPath(source, fileName)); File newFile = new File(combainPath(destination, fileName)); mv(oldFile, newFile, cover); } } catch (Exception ex) { j2log(null, null, ex); } } /** * mv 移动文件 * * @param source * @param destination * @param cover */ public static void mv(String source, String destination, boolean cover) { try { if (!source.equals(destination)) { File oldFile = new File(source); File newFile = new File(destination); mv(oldFile, newFile, cover); } } catch (Exception ex) { j2log(null, null, ex); } } /** * mv 移动文件 * * @param source * @param destination * @param cover */ public static void mv(File source, File destination, boolean cover) { try { if (!source.exists()) { throw new FileNotFoundException(); } StringBuilder fileName = new StringBuilder(source.getName()); if (!cover && source.getPath().equals(destination.getPath())) { if (fileName.indexOf(".") > 0) { fileName.insert(fileName.lastIndexOf("."), "_副本"); } else { fileName.append("_副本"); } cp(source, new File(combainPath(source.getParent(), fileName.toString()))); } else { source.renameTo(destination); } } catch (Exception ex) { j2log(null, null, ex); } } /** * extensions 获取文件扩展名信息 * * @param filePath * @param fileName * @return */ private static String[] extensions(String filePath, String fileName) { String[] extension = {}; try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); extensions(file); } catch (Exception ex) { j2log(null, null, ex); } return extension; } /** * extensions 获取文件扩展名信息 * * @param fullPath * @return */ private static String[] extensions(String fullPath) { String[] extension = {}; try { File file = new File(fullPath); extensions(file); } catch (Exception ex) { j2log(null, null, ex); } return extension; } /** * extensions 获取文件扩展名信息 * * @param file * @return */ private static String[] extensions(File file) { String[] extension = {}; try { if (file.isFile()) { String fileName = file.getName(); if (fileName.lastIndexOf(".") >= 0) { int lastIndex = fileName.lastIndexOf("."); extension[0] = String.valueOf(lastIndex);//扩展名的“.”的索引 extension[1] = fileName.substring(lastIndex + 1);//扩展名 extension[2] = fileName.substring(0, lastIndex);//文件名 } } } catch (Exception ex) { j2log(null, null, ex); } return extension; } /** * ls 遍历文件 * * @param filePath * @param loop * @return */ public static List<File> ls(String filePath, boolean loop) { List<File> list = new ArrayList(); try { File file = new File(filePath); list.addAll(ls(file, loop)); } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * ls 遍历文件 * * @param file * @param loop * @return */ public static List<File> ls(File file, boolean loop) { List<File> list = new ArrayList(); try { list.add(file); if (!file.isDirectory()) { list.add(file); } else if (file.isDirectory()) { File[] subList = file.listFiles(); subList = filesSort(subList, true); for (File subFile : subList) { if (subFile.isDirectory() && loop) { list.addAll(ls(subFile.getPath(), loop)); } else { list.add(subFile); } } } } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * filesSort 文件排序(默认升序) * * @param parentPath * @param subList * @return */ private static File[] filesSort(File[] inFiles, boolean asc) { List<String> files = new ArrayList(); List<String> dirs = new ArrayList(); for (File subFile : inFiles) { if (subFile.isDirectory()) { dirs.add(subFile.getPath()); } else if (subFile.isFile()) { files.add(subFile.getPath()); } } String[] fileArray = {}; if (files.size() > 0) { fileArray = list2Array(files); Arrays.sort(fileArray); if (!asc) { Arrays.sort(fileArray, Collections.reverseOrder()); } } String[] dirArray = {}; if (dirs.size() > 0) { dirArray = list2Array(dirs); Arrays.sort(dirArray); if (!asc) { Arrays.sort(dirArray, Collections.reverseOrder()); } } return concat2FileArray(fileArray, dirArray); } /** * concat2FileArray 合并文件数组 * * @param old1 * @param old2 * @return */ private static File[] concat2FileArray(String[] old1, String[] old2) { File[] newArray = new File[old1.length + old2.length]; for (int i = 0, n = old1.length; i < n; i++) { newArray[i] = new File(old1[i]); } for (int i = 0, j = old1.length, n = (old1.length + old2.length); j < n; i++, j++) { newArray[j] = new File(old2[i]); } return newArray; } /** * read 读取文本文件 * * @param filePath * @param fileName * @param charset * @return */ public static StringBuilder read(String filePath, String fileName, String charset) { StringBuilder sb = new StringBuilder(); try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); sb.append(FileTools.tail(file, false, 0, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * read 读取文本文件 * * @param fullPath * @param charset * @return */ public static StringBuilder read(String fullPath, String charset) { StringBuilder sb = new StringBuilder(); try { File file = new File(fullPath); sb.append(FileTools.tail(file, false, 0, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * read 读取文本文件 * * @param file * @param charset * @return */ public static StringBuilder read(File file, String charset) { StringBuilder sb = new StringBuilder(); try { sb.append(FileTools.tail(file, false, 0, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * find 读取文本文件指定行 * * @param filePath * @param fileName * @param line * @param charset * @return */ public static StringBuilder find(String filePath, String fileName, int line, String charset) { StringBuilder sb = new StringBuilder(); try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); sb.append(FileTools.tail(file, true, line, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * find 读取文本文件指定行 * * @param fullPath * @param line * @param charset * @return */ public static StringBuilder find(String fullPath, int line, String charset) { StringBuilder sb = new StringBuilder(); try { File file = new File(fullPath); sb.append(FileTools.tail(file, true, line, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * find 读取文本文件指定行 * * @param file * @param line * @param charset * @return */ public static StringBuilder find(File file, int line, String charset) { StringBuilder sb = new StringBuilder(); try { sb.append(FileTools.tail(file, true, line, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * tail 读取文本文件 * * @param filePath * @param fileName * @param charset * @param find * @param line * @return */ public static StringBuilder tail(String filePath, String fileName, boolean find, int line, String charset) { StringBuilder sb = new StringBuilder(); try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); sb.append(FileTools.tail(file, find, line, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * tail 读取文本文件 * * @param fullPath * @param charset * @param find * @param line * @return */ public static StringBuilder tail(String fullPath, boolean find, int line, String charset) { StringBuilder sb = new StringBuilder(); try { File file = new File(fullPath); sb.append(FileTools.tail(file, find, line, charset)); } catch (Exception ex) { j2log(null, null, ex); } return sb; } /** * tail 读取文本文件 * * @param file * @param charset * @param find * @param line * @return */ public static StringBuilder tail(File file, boolean find, int line, String charset) { StringBuilder sb = new StringBuilder(); BufferedReader bufferReader = null; if (null == charset || "".equals(charset)) { charset = "UTF-8"; } try { if (!file.exists() || file.isDirectory()) { throw new FileNotFoundException(); } String fullPath = file.getPath(); bufferReader = new BufferedReader(new InputStreamReader(new FileInputStream(fullPath), charset)); String temp; for (int i = 0; (temp = bufferReader.readLine()) != null; i++) { if (!find || line == i) { sb.append(temp); } } } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != bufferReader) { try { bufferReader.close(); } catch (IOException ex) { j2log(null, null, ex); } } } return sb; } /** * sed 读取文本文件 * * @param filePath * @param fileName * @param charset * @return */ public static List<String> sed(String filePath, String fileName, String charset) { List<String> list = new ArrayList(); try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); list.addAll(FileTools.sed(file, charset)); } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * sed 读取文本文件 * * @param fullPath * @param charset * @return */ public static List<String> sed(String fullPath, String charset) { List<String> list = new ArrayList(); try { File file = new File(fullPath); list.addAll(FileTools.sed(file, charset)); } catch (Exception ex) { j2log(null, null, ex); } return list; } /** * sed 读取文本文件 * * @param file * @param charset * @return */ public static List<String> sed(File file, String charset) { List<String> list = new ArrayList(); BufferedReader bufferReader = null; if (null == charset || "".equals(charset)) { charset = "UTF-8"; } try { if (!file.exists() || file.isDirectory()) { throw new FileNotFoundException(); } String fullPath = file.getPath(); bufferReader = new BufferedReader(new InputStreamReader(new FileInputStream(fullPath), charset)); String temp; for (int i = 0; (temp = bufferReader.readLine()) != null; i++) { list.add(temp); } } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != bufferReader) { try { bufferReader.close(); } catch (IOException ex) { j2log(null, null, ex); } } } return list; } /** * cat 读取文本文件 * * @param filePath * @param fileName * @return */ public static byte[] cat(String filePath, String fileName) { byte[] output = {}; try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); output = FileTools.cat(file); } catch (Exception ex) { j2log(null, null, ex); } return output; } /** * cat 读取文本文件 * * @param fullPath * @return */ public static byte[] cat(String fullPath) { byte[] output = {}; try { File file = new File(fullPath); output = FileTools.cat(file); } catch (Exception ex) { j2log(null, null, ex); } return output; } /** * cat 读取文本文件 * * @param file * @return */ public static byte[] cat(File file) { InputStream in = null; byte[] output = {}; try { if (!file.exists() || file.isDirectory()) { throw new FileNotFoundException(); } String fullPath = file.getPath(); long length = du(file, false); long _2M = 2097152; byte[] bytes = new byte[(int) length]; in = new FileInputStream(fullPath); for (int count = 0; count != -1;) { if (length > 16 * _2M) { length = 4 * _2M; } else if (length > 8 * _2M) { length = 2 * _2M; } else if (length > 4 * _2M) { length = _2M; } else if (length > 2 * _2M) { length = _2M / 2; } else if (length > _2M) { length = _2M / 4; } else { length = 4096; } bytes = new byte[(int) length]; count = in.read(bytes); output = concatArray(bytes, output); length = in.available(); } } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != in) { try { in.close(); } catch (Exception ex) { j2log(null, null, ex); } } } return output; } /** * 合并数组 * * @param old1 * @param old2 * @return */ private static byte[] concatArray(byte[] old1, byte[] old2) { byte[] newArray = new byte[old1.length + old2.length]; System.arraycopy(old1, 0, newArray, 0, old1.length); System.arraycopy(old2, 0, newArray, old1.length, old2.length); return newArray; } /** * dd 写入文件fullPath内容content * * @param filePath * @param fileName * @param content * @param isAppend */ public static void dd(String filePath, String fileName, byte[] content, boolean isAppend) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); FileTools.dd(file, content, isAppend); } catch (Exception ex) { j2log(null, null, ex); } } /** * dd 写入文件fullPath内容content * * @param fullPath * @param content * @param isAppend */ public static void dd(String fullPath, byte[] content, boolean isAppend) { try { File file = new File(fullPath); FileTools.dd(file, content, isAppend); } catch (Exception ex) { j2log(null, null, ex); } } /** * dd 写入文件fullPath内容content * * @param file * @param content * @param isAppend */ public static void dd(File file, byte[] content, boolean isAppend) { FileOutputStream fileOutputStream = null; try { if (!file.exists()) { file.createNewFile(); } fileOutputStream = new FileOutputStream(file, isAppend); fileOutputStream.write(content); } catch (Exception ex) { j2log(null, null, ex); } finally { try { if (null != fileOutputStream) { fileOutputStream.close(); } } catch (IOException ex) { j2log(null, null, ex); } } } /** * write 写文件内容content到文件fullPath * * @param filePath * @param fileName * @param content */ public static void write(String filePath, String fileName, String content) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); FileTools.write(file, content, true); } catch (Exception ex) { j2log(null, null, ex); } } /** * write 写文件内容content到文件fullPath * * @param fullPath * @param content */ public static void write(String fullPath, String content) { try { File file = new File(fullPath); FileTools.write(file, content, true); } catch (Exception ex) { j2log(null, null, ex); } } /** * write 写文件内容content到文件fullPath * * @param file * @param content */ public static void write(File file, String content) { try { FileTools.write(file, content, true); } catch (Exception ex) { j2log(null, null, ex); } } /** * write 写(追加)文件内容content到文件fullPath * * @param filePath * @param fileName * @param content * @param isAppend */ public static void write(String filePath, String fileName, String content, boolean isAppend) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); FileTools.write(file, content, isAppend); } catch (Exception ex) { j2log(null, null, ex); } } /** * write 写(追加)文件内容content到文件fullPath * * @param fullPath * @param content * @param isAppend */ public static void write(String fullPath, String content, boolean isAppend) { try { File file = new File(fullPath); FileTools.write(file, content, isAppend); } catch (Exception ex) { j2log(null, null, ex); } } /** * write 写(追加)文件内容content到文件fullPath * * @param file * @param content * @param isAppend */ public static void write(File file, String content, boolean isAppend) { FileWriter fileWriter = null; try { if (!file.exists()) { file.createNewFile(); } fileWriter = new FileWriter(file.getPath(), isAppend); fileWriter.write(content); } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != fileWriter) { try { fileWriter.close(); } catch (IOException ex) { j2log(null, null, ex); } } } } /** * tail 添加文件内容content到文件的index位置 * * @param filePath * @param fileName * @param content * @param index */ public static void tail(String filePath, String fileName, String content, long index) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); FileTools.tail(file, content, index); } catch (Exception ex) { j2log(null, null, ex); } } /** * tail 添加文件内容content到文件的index位置 * * @param fullPath * @param content * @param index */ public static void tail(String fullPath, String content, long index) { try { File file = new File(fullPath); FileTools.tail(file, content, index); } catch (Exception ex) { j2log(null, null, ex); } } /** * tail 添加文件内容content到文件的index位置 * * @param file * @param content * @param index */ public static void tail(File file, String content, long index) { RandomAccessFile randomAccessFile = null; try { if (!file.exists()) { file.createNewFile(); } randomAccessFile = new RandomAccessFile(file.getPath(), "rw"); randomAccessFile.seek(index); randomAccessFile.writeBytes(content); } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != randomAccessFile) { try { randomAccessFile.close(); } catch (Exception ex) { j2log(null, null, ex); } } } } /** * mkdir 创建目录 * * @param filePath * @param fileName * @return */ public static File mkdir(String filePath, String fileName) { File file = null; try { String fullPath = combainPath(filePath, fileName); file = new File(fullPath); file = mkdir(file); } catch (Exception ex) { j2log(null, null, ex); } return file; } /** * mkdir 创建目录 * * @param fullPath * @return */ public static File mkdir(String fullPath) { File file = null; try { file = new File(fullPath); file = mkdir(file); } catch (Exception ex) { j2log(null, null, ex); } return file; } /** * mkdir 创建目录 * * @param file * @return */ public static File mkdir(File file) { try { if (!file.exists()) { file.mkdir();//如果文件夹不存在则创建 } } catch (Exception ex) { j2log(null, null, ex); } return file; } /** * touch 创建文件 * * @param filePath * @param fileName */ public static void touch(String filePath, String fileName) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); touch(file); } catch (Exception ex) { j2log(null, null, ex); } } /** * touch 创建文件 * * @param fullPath */ public static void touch(String fullPath) { try { File file = new File(fullPath); touch(file); } catch (Exception ex) { j2log(null, null, ex); } } /** * touch 创建文件 * * @param file */ public static void touch(File file) { try { if (!file.exists()) { file.createNewFile();//如果文件不存在则创建 } } catch (Exception ex) { j2log(null, null, ex); } } /** * rm 删除文件 * * @param filePath * @param fileName */ public static void rm(String filePath, String fileName) { try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); rm(file); } catch (Exception ex) { j2log(null, null, ex); } } /** * rm 删除文件 * * @param fullPath */ public static void rm(String fullPath) { try { File file = new File(fullPath); rm(file); } catch (Exception ex) { j2log(null, null, ex); } } /** * rm 删除文件 * * @param file */ public static void rm(File file) { try { if (!file.exists()) { throw new FileNotFoundException(); } if (file.isFile()) { file.delete(); } } catch (Exception ex) { j2log(null, null, ex); } } /** * rmdir 删除目录 * * @param filePath * @param fileName * @param loop */ public static void rmdir(String filePath, String fileName, boolean loop) { try { String fullPath = combainPath(filePath, fileName); File dir = new File(fullPath); rmdir(dir, loop); } catch (Exception ex) { j2log(null, null, ex); } } /** * rmdir 删除目录 * * @param fullPath * @param loop */ public static void rmdir(String fullPath, boolean loop) { try { File dir = new File(fullPath); rmdir(dir, loop); } catch (Exception ex) { j2log(null, null, ex); } } /** * rmdir 删除目录 * * @param dir * @param loop */ public static void rmdir(File dir, boolean loop) { try { if (!dir.exists()) { throw new FileNotFoundException(); } if (dir.isDirectory()) { File[] files = dir.listFiles(); int length = files.length; for (int i = 0; i < length && loop; i++) { if (files[i].isDirectory()) { rmdir(files[i], loop); } else { rm(files[i]); } } if (loop || length == 0) { dir.delete(); } } } catch (Exception ex) { j2log(null, null, ex); } } /** * du 获取文件实际大小 * * @param filePath * @param fileName * @param loop * @return */ public static long du(String filePath, String fileName, boolean loop) { long size = 0; try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); size = du(file, loop); } catch (Exception ex) { j2log(null, null, ex); } return size; } /** * du 获取文件实际大小 * * @param filePath * @param fileName * @return */ public static long du(String filePath, String fileName) { long size = 0; try { String fullPath = combainPath(filePath, fileName); File file = new File(fullPath); size = du(file, false); } catch (Exception ex) { j2log(null, null, ex); } return size; } /** * du 获取文件实际大小 * * @param fullPath * @return */ public static long du(String fullPath) { long size = 0; try { File file = new File(fullPath); size = du(file, false); } catch (Exception ex) { j2log(null, null, ex); } return size; } /** * du 获取文件实际大小 * * @param file * @return */ public static long du(File file) { long size = 0; try { size = du(file, false); } catch (Exception ex) { j2log(null, null, ex); } return size; } /** * du 获取文件实际大小 * * @param fullPath * @param loop * @return */ public static long du(String fullPath, boolean loop) { long size = 0; try { File file = new File(fullPath); size = du(file, loop); } catch (Exception ex) { j2log(null, null, ex); } return size; } /** * du 获取文件实际大小 * * @param file * @param loop * @return */ public static long du(File file, boolean loop) { FileChannel fileChannel = null; long size = 0; try { if (!file.exists()) { throw new FileNotFoundException(); } if (file.isFile()) { FileInputStream fis = new FileInputStream(file); fileChannel = fis.getChannel(); size = fileChannel.size(); } else if (file.isDirectory()) { File[] files = file.listFiles(); int length = files.length; for (int i = 0; i < length && loop; i++) { if (files[i].isDirectory()) { du(files[i], loop); } else { size += du(files[i], false); } } } } catch (Exception ex) { j2log(null, null, ex); } finally { if (null != fileChannel) { try { fileChannel.close(); } catch (Exception ex) { j2log(null, null, ex); } } } return size; } }

Java is widely used in enterprise-level applications because of its platform independence. 1) Platform independence is implemented through Java virtual machine (JVM), so that the code can run on any platform that supports Java. 2) It simplifies cross-platform deployment and development processes, providing greater flexibility and scalability. 3) However, it is necessary to pay attention to performance differences and third-party library compatibility and adopt best practices such as using pure Java code and cross-platform testing.

JavaplaysasignificantroleinIoTduetoitsplatformindependence.1)Itallowscodetobewrittenonceandrunonvariousdevices.2)Java'secosystemprovidesusefullibrariesforIoT.3)ItssecurityfeaturesenhanceIoTsystemsafety.However,developersmustaddressmemoryandstartuptim

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java'splatformindependenceissignificantbecauseitallowsdeveloperstowritecodeonceandrunitonanyplatformwithaJVM.This"writeonce,runanywhere"(WORA)approachoffers:1)Cross-platformcompatibility,enablingdeploymentacrossdifferentOSwithoutissues;2)Re

Java is suitable for developing cross-server web applications. 1) Java's "write once, run everywhere" philosophy makes its code run on any platform that supports JVM. 2) Java has a rich ecosystem, including tools such as Spring and Hibernate, to simplify the development process. 3) Java performs excellently in performance and security, providing efficient memory management and strong security guarantees.

JVM implements the WORA features of Java through bytecode interpretation, platform-independent APIs and dynamic class loading: 1. Bytecode is interpreted as machine code to ensure cross-platform operation; 2. Standard API abstract operating system differences; 3. Classes are loaded dynamically at runtime to ensure consistency.

The latest version of Java effectively solves platform-specific problems through JVM optimization, standard library improvements and third-party library support. 1) JVM optimization, such as Java11's ZGC improves garbage collection performance. 2) Standard library improvements, such as Java9's module system reducing platform-related problems. 3) Third-party libraries provide platform-optimized versions, such as OpenCV.

The JVM's bytecode verification process includes four key steps: 1) Check whether the class file format complies with the specifications, 2) Verify the validity and correctness of the bytecode instructions, 3) Perform data flow analysis to ensure type safety, and 4) Balancing the thoroughness and performance of verification. Through these steps, the JVM ensures that only secure, correct bytecode is executed, thereby protecting the integrity and security of the program.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Dreamweaver Mac version
Visual web development tools

Dreamweaver CS6
Visual web development tools
