将 java.nio.file.Path 转换为文件失败
converting java.nio.file.Path to File got failed
我正在尝试将 .cer 文件打包到 jar 中并使用 java 将它们动态安装到密钥库。
private List<File> doSomething(Path p) {
List<java.io.File>FileList=new ArrayList<>();
try {
int level = 1;
if (p.toString().equals("BOOT-INF/classes/certs")) {
level = 2;
Stream<Path> walk = Files.walk(p, level);
for (Iterator<Path> it = walk.iterator(); it.hasNext(); ) {
System.out.println(it.next());//getting all .cer files in the folder
FileList.add(it.next().toFile());//getting an error UnsupportedOperationException Path not associated with
}
logger.info("fileList" + FileList.size());
}
}
catch(Exception e)
{
logger.error("error-----------"+e);
}
return FileList;
}
我收到 UnsupportedOperationExceptionintoFile(),请相信这是因为我正在尝试访问 jar 中的文件。
有什么方法可以将此路径(nio.file.Path)转换为实际文件或流吗?
Path#toString() 不会 return 带有正斜杠的路径 (/) 就像您要比较的字符串路径一样。它 return 与 back-slashes (\) 相同,因此您的比较永远不会成立。
从本地文件系统读取路径时,始终使用与系统相关的路径或文件分隔符。为此,您可以使用 String#replaceAll() 方法将任何路径名斜杠转换为适合您的代码运行的文件系统的内容,例如:
String pathToCompare = "BOOT-INF/classes/certs"
.replaceAll("[\/]", "\" + File.separator);
这应该可以正常工作:
private List<java.io.File> doSomething(java.nio.file.Path p) {
java.util.List<java.io.File> FileList = new java.util.ArrayList<>();
try {
int level = 1;
String pathToCompare = "BOOT-INF/classes/certs"
.replaceAll("[\/]", "\" + File.separator);
if (p.toString().equals(pathToCompare)) {
level = 2;
java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p, level);
for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
System.out.println(it.next());//getting all .cer files in the folder
FileList.add(it.next().toFile());//getting an error UnsupportedOperationException Path not associated with
}
}
}
catch (Exception e) {
System.err.println(e);
}
return FileList;
}
EDIT:
如果您希望您的列表基于特定的文件扩展名和/或 JAR 文件的内容,那么您需要做一些不同的事情。下面的代码与您一直使用的代码非常相似,不同之处在于:
- 方法名改为getFilesList();
- 列表被 return编辑为
List<String>
而不是
List<File>
;
- 深度级别现在是提供给方法的参数(总是
确保深度级别足以执行任务);
- 一个可选的 String args 参数(命名为:
onlyExtensions
)已经
添加到方法中,以便一个(或多个)文件扩展名可以
应用于 return 仅包含文件所在路径的列表
名称包含应用的扩展名。如果提供扩展
恰好是 ".jar"
那么该 JAR 文件的内容也将
应用于 returned 列表。如果什么都不提供,那么所有
文件在列表中 returned。
对于 JAR 文件,还提供了一个辅助方法:
修改您认为合适的任何代码:
public static List<String> getFilesList(String thePath, int depthLevel, String... onlyExtensions) {
Path p = Paths.get(thePath);
java.util.List<String> FileList = new java.util.ArrayList<>();
try {
java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p, depthLevel);
for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
File theFile = it.next().toFile();
if (onlyExtensions.length > 0) {
for (String ext : onlyExtensions) {
ext = ext.trim();
if (!ext.startsWith(".")) {
ext = "." + ext;
}
if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(ext)) {
FileList.add(theFile.getName() + " --> " + theFile.getAbsolutePath());
}
else if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(".jar")) {
List<String> jarList = getFilesNamesFromJAR(theFile.getAbsolutePath());
for (String strg : jarList) {
FileList.add(theFile.getName() + " --> " + strg);
}
}
}
}
else {
FileList.add(theFile.getAbsolutePath());
}
}
}
catch (Exception e) {
System.err.println(e);
}
return FileList;
}
JAR 文件助手方法:
public static java.util.List<String> getFilesNamesFromJAR(String jarFilePath) {
java.util.List<String> fileNames = new java.util.ArrayList<>();
java.util.zip.ZipInputStream zip = null;
try {
zip = new java.util.zip.ZipInputStream(new java.io.FileInputStream(jarFilePath));
for (java.util.zip.ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
fileNames.add(entry.getName());
}
}
catch (java.io.FileNotFoundException ex) {
System.err.println(ex);
}
catch (java.io.IOException ex) {
System.err.println(ex);
}
finally {
try {
if (zip != null) {
zip.close();
}
}
catch (IOException ex) {
System.err.println(ex);
}
}
return fileNames;
}
要使用 getFileList() 方法,您可以这样做:
List<String> fileNames = getFilesList("C:\MyDataFolder", 3, ".cer", ".jar");
// Display files in fileNames List
for (String str : fileNames) {
System.out.println(str);
}
我正在尝试将 .cer 文件打包到 jar 中并使用 java 将它们动态安装到密钥库。
private List<File> doSomething(Path p) {
List<java.io.File>FileList=new ArrayList<>();
try {
int level = 1;
if (p.toString().equals("BOOT-INF/classes/certs")) {
level = 2;
Stream<Path> walk = Files.walk(p, level);
for (Iterator<Path> it = walk.iterator(); it.hasNext(); ) {
System.out.println(it.next());//getting all .cer files in the folder
FileList.add(it.next().toFile());//getting an error UnsupportedOperationException Path not associated with
}
logger.info("fileList" + FileList.size());
}
}
catch(Exception e)
{
logger.error("error-----------"+e);
}
return FileList;
}
我收到 UnsupportedOperationExceptionintoFile(),请相信这是因为我正在尝试访问 jar 中的文件。 有什么方法可以将此路径(nio.file.Path)转换为实际文件或流吗?
Path#toString() 不会 return 带有正斜杠的路径 (/) 就像您要比较的字符串路径一样。它 return 与 back-slashes (\) 相同,因此您的比较永远不会成立。
从本地文件系统读取路径时,始终使用与系统相关的路径或文件分隔符。为此,您可以使用 String#replaceAll() 方法将任何路径名斜杠转换为适合您的代码运行的文件系统的内容,例如:
String pathToCompare = "BOOT-INF/classes/certs"
.replaceAll("[\/]", "\" + File.separator);
这应该可以正常工作:
private List<java.io.File> doSomething(java.nio.file.Path p) {
java.util.List<java.io.File> FileList = new java.util.ArrayList<>();
try {
int level = 1;
String pathToCompare = "BOOT-INF/classes/certs"
.replaceAll("[\/]", "\" + File.separator);
if (p.toString().equals(pathToCompare)) {
level = 2;
java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p, level);
for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
System.out.println(it.next());//getting all .cer files in the folder
FileList.add(it.next().toFile());//getting an error UnsupportedOperationException Path not associated with
}
}
}
catch (Exception e) {
System.err.println(e);
}
return FileList;
}
EDIT:
如果您希望您的列表基于特定的文件扩展名和/或 JAR 文件的内容,那么您需要做一些不同的事情。下面的代码与您一直使用的代码非常相似,不同之处在于:
- 方法名改为getFilesList();
- 列表被 return编辑为
List<String>
而不是List<File>
; - 深度级别现在是提供给方法的参数(总是 确保深度级别足以执行任务);
- 一个可选的 String args 参数(命名为:
onlyExtensions
)已经 添加到方法中,以便一个(或多个)文件扩展名可以 应用于 return 仅包含文件所在路径的列表 名称包含应用的扩展名。如果提供扩展 恰好是".jar"
那么该 JAR 文件的内容也将 应用于 returned 列表。如果什么都不提供,那么所有 文件在列表中 returned。
对于 JAR 文件,还提供了一个辅助方法:
修改您认为合适的任何代码:
public static List<String> getFilesList(String thePath, int depthLevel, String... onlyExtensions) {
Path p = Paths.get(thePath);
java.util.List<String> FileList = new java.util.ArrayList<>();
try {
java.util.stream.Stream<Path> walk = java.nio.file.Files.walk(p, depthLevel);
for (java.util.Iterator<Path> it = walk.iterator(); it.hasNext();) {
File theFile = it.next().toFile();
if (onlyExtensions.length > 0) {
for (String ext : onlyExtensions) {
ext = ext.trim();
if (!ext.startsWith(".")) {
ext = "." + ext;
}
if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(ext)) {
FileList.add(theFile.getName() + " --> " + theFile.getAbsolutePath());
}
else if (!theFile.isDirectory() && theFile.getName().substring(theFile.getName().lastIndexOf(".")).equalsIgnoreCase(".jar")) {
List<String> jarList = getFilesNamesFromJAR(theFile.getAbsolutePath());
for (String strg : jarList) {
FileList.add(theFile.getName() + " --> " + strg);
}
}
}
}
else {
FileList.add(theFile.getAbsolutePath());
}
}
}
catch (Exception e) {
System.err.println(e);
}
return FileList;
}
JAR 文件助手方法:
public static java.util.List<String> getFilesNamesFromJAR(String jarFilePath) {
java.util.List<String> fileNames = new java.util.ArrayList<>();
java.util.zip.ZipInputStream zip = null;
try {
zip = new java.util.zip.ZipInputStream(new java.io.FileInputStream(jarFilePath));
for (java.util.zip.ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
fileNames.add(entry.getName());
}
}
catch (java.io.FileNotFoundException ex) {
System.err.println(ex);
}
catch (java.io.IOException ex) {
System.err.println(ex);
}
finally {
try {
if (zip != null) {
zip.close();
}
}
catch (IOException ex) {
System.err.println(ex);
}
}
return fileNames;
}
要使用 getFileList() 方法,您可以这样做:
List<String> fileNames = getFilesList("C:\MyDataFolder", 3, ".cer", ".jar");
// Display files in fileNames List
for (String str : fileNames) {
System.out.println(str);
}