背景
这是一个多线程批处理应用程序,每个线程都有自己的文件。我在其他地方有逻辑,可以在文件创建失败的情况下阻止文件重命名。
该进程作为守护进程运行,每天生成数千个文件。此异常可能每 3 天发生 1 个文件,因此我们使用的方法在大多数情况下都有效。
运行该批处理的机器是Red Hat Enterprise Linux Server release 6.7 (Santiago) 
Java版本是1.8.0_162
临时文件名是通过附加 java.util.UUID 中 UUID.randomUUID() 的结果生成的。
真实的文件名可能有重复,这就是为什么我们使用 rand UUID 而不是 .tmp 作为临时文件名。这应该不是问题,因为移动部分位于同步块中。
例外:
2018-07-26 15:06:01,743 ERROR (ProcessRecordsTask.java:renameFileAfterProcess():674)  - Error: Unable to rename file:
java.nio.file.NoSuchFileException: /logs/apps/appname/FILNAMESTUFF_07_26_2018_15_05_51.xml.5c80331c-3b7e-4e16-90d7-c0d7810451c5 -> /logs/apps/appname/FILNAMESTUFF_07_26_2018_15_05_51.xml
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:396)
        at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262)
        at java.nio.file.Files.move(Files.java:1395)
        at com.filetransferbatch.task.ProcessRecordsTask.renameFileAfterProcess(ProcessRecordsTask.java:664)
        at com.filetransferbatch.task.ProcessRecordsTask.saveFileData(ProcessRecordsTask.java:349)
        at com.filetransferbatch.task.ProcessRecordsTask.xmlTransfer(ProcessRecordsTask.java:244)
        at com.filetransferbatch.task.ProcessRecordsTask.call(ProcessRecordsTask.java:162)
        at com.filetransferbatch.task.ProcessRecordsTask.call(ProcessRecordsTask.java:62)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
我从以下代码片段中得到异常:
private boolean renameFileAfterProcess(String tmpFileName) {
    boolean fileRenamed …我正在尝试用 Java 读取文本文件,但我得到NoSuchFileException.
我试图检查文件路径是否存在并返回true。这是我的代码。
            final File actualFile = new File(filePath);
            if (actualFile.exists()) {
                log.info("ACTUALFILE exists");
            } else {
                log.info("ACTUALFILE does not exist");
            }
            String content = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
我得到以下异常。
ACTUALFILE exists
java.nio.file.NoSuchFileException: my-file.json
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) ~[?:1.8.0_201]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:1.8.0_201]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:1.8.0_201]
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) ~[?:1.8.0_201]
at java.nio.file.Files.newByteChannel(Files.java:361) ~[?:1.8.0_201]
at java.nio.file.Files.newByteChannel(Files.java:407) ~[?:1.8.0_201]
at java.nio.file.Files.readAllBytes(Files.java:3152) ~[?:1.8.0_201]
为什么 Files.readAllBytes() 无法找到文件?我在这里错过了什么吗?
[更新 1] 这是文件权限-rwxr-xr-x。
我对一个看似简单的应用程序有疑问。它应该做什么:
-读出(硬编码)目录的文件(*.jpg)
-使用所述 jpg 包含的元数据(通过实现的库获得)生成目录(./year/month/)
- 将文件复制到相应的目录中。
它没有什么: - 将文件复制到相应的目录中,因为它找不到原始文件(它之前自己读出的)。老实说,我不知道为什么会这样。
这里是源代码:
package fotosorter;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifIFD0Directory;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Date;
public class Fotosorter {
/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws JpegProcessingException, IOException {
    File startdir = new File(System.getProperty("user.dir"));
    FileFilter jpg = new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.getAbsoluteFile().toString().toLowerCase().endsWith(".jpg");
        }
    };
    File dir = new File(startdir, "bitmaps"+File.separator+"java-temp"); …主机系统:Windows Server 2008 32-bit
安装:Cygwin
我不知道这个问题是什么时候开始的,但我的一个 Rails gems 使用该命令which来确定系统安装的可执行文件的位置。在我的情况下,它返回/cygdrive/c/Windows/System32/pngcrush- 并且文件无法访问。
在 cygwin 终端和 Windows cmd 中,我得到以下信息:
ls -la /cygdrive/c = No such file or directory
mount = 
C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
C:/cygwin on / type ntfs (binary,auto)
B: on /cygdrive/b type smbfs (binary,posix=0,user,noumount,auto
C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)
cd /在 Windows 终端中运行将我带到C:\
cd /cygdrive = The system cannot find the path specified
进一步编辑:
我可以访问使用的驱动器/c …
我为这个看似简单且几乎是一个愚蠢的问题道歉,但我花了很多时间来修复它而没有太大的成功.
我创建了一个非常简单的maven项目,然后在这个src/resources文件夹中创建了一个简单的文本文件.
pom.xml很简单.这个App类看起来像这样:
public class App {
    public static void main(String[] args) throws IOException {
        Files.lines(Paths.get("test.txt")).forEach(System.out::println);
    }
}
我得到的例外:
Exception in thread "main" java.nio.file.NoSuchFileException: test.txt
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.nio.file.Files.newInputStream(Files.java:152)
    at java.nio.file.Files.newBufferedReader(Files.java:2784)
    at java.nio.file.Files.lines(Files.java:3744)
    at java.nio.file.Files.lines(Files.java:3785)
    at com.rahul.App.main(App.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1
这似乎是一个非常愚蠢的问题,但我无法理解它.任何帮助都是真诚的感谢.
当我在Eclipse中编译并运行我的程序时,运行没有异常.但是当我将它导出到可运行的jar或普通jar时,它找不到我的设置文件.
我的道路是:
String path= "src/settings/settings.ini";
在eclipse中它运行无例外,但在jar中,它会立即抛出异常.
怎么可能让jar像日食一样工作?