Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat servlet无法读取文件_Java_File_Tomcat_Servlets - Fatal编程技术网

Java Tomcat servlet无法读取文件

Java Tomcat servlet无法读取文件,java,file,tomcat,servlets,Java,File,Tomcat,Servlets,我正在制作一个Java web应用程序,它将在Tomcat下运行。代码将从文件(在服务器上)中读取一个数字,进行一些处理,然后将结果写回同一个文件(覆盖旧内容,而不是附加它),并将其显示在用户的HTML页面中 我使用这个单例(以避免多线程可能出现的问题)来读取和写入文件,以及返回数字。servlet类调用此方法 public class Singleton { private static Singleton instance; private ObjectOutputStream fileO

我正在制作一个Java web应用程序,它将在Tomcat下运行。代码将从文件(在服务器上)中读取一个数字,进行一些处理,然后将结果写回同一个文件(覆盖旧内容,而不是附加它),并将其显示在用户的HTML页面中

我使用这个单例(以避免多线程可能出现的问题)来读取和写入文件,以及返回数字。servlet类调用此方法

public class Singleton {

private static Singleton instance;
private ObjectOutputStream fileOut;
private ObjectInputStream fileIn;
private File file;
private static final String fileName = "/Users/Timmy/Desktop/IDFile.txt";
private static final int SCALE = 1000000;

public synchronized long getNewID() throws IOException{
    if(file == null){
        file = new File(fileName);
    }
    if(!file.exists()){
        file.createNewFile();
    }
    fileOut = new ObjectOutputStream(new FileOutputStream(file));   
    fileIn = new ObjectInputStream(new FileInputStream(file));

    long lastId;
    String idString;
    try{
        idString = fileIn.readUTF();
        lastId = Long.parseLong(idString);
    }catch(EOFException e){
        System.out.println("EOF EXCEPTION WHILE READING");
        e.printStackTrace();
        lastId = (long)(Math.random() * SCALE);
    }


    fileIn.close();
    fileIn = null;

    long nextId = lastId + ((long)(Math.random() * SCALE)) + 1;

    fileOut.writeChars(Long.toString(nextId) + "\n");
    fileOut.close();
    fileOut = null;

    return nextId;
}

public static Singleton getInstance(){
    if(instance == null){
        instance = new Singleton();
    }
    return instance;
}

}
这是堆栈跟踪:

java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
at java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2808)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2864)
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1072)
at com.digitalpyrite.assassin.server.Singleton.getNewID(Singleton.java:37)
at com.digitalpyrite.assassin.server.Main.doGet(Main.java:42)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

我遇到的问题是,每次调用getNewID()方法时,读取文件时都会抛出一个EOFEException。只有在程序第一次运行时,当文件是新创建的且为空时,才应该抛出它。我尝试了各种不同的方法来读取此文件,但都失败了。扫描器抛出NoSuchElementException,读卡器在读取文本时返回null,等等。我做错了什么?

首先,在注释中:这个字符串
“/Users/Timmy/Desktop/IDFile.txt”
看起来非常容易出错。在您的案例中,这可能不是问题所在,但您仍然应该取消硬编码——就像这样,这是一个潜在的正在形成的bug


关于EOF问题:首先,
FileInputStream
FileOutputStream
与相同的
File
对象交互。因为您没有交错使用它们,所以在使用
InputStream
时,应该将
OutputStream的开口移动到:

...
fileIn.close();
fileIn = null;

fileOut = new ObjectOutputStream(new FileOutputStream(file));
...

第二:你在用不同的编码写作。您应该使用
writeUTF()
,以便能够使用
readUTF()
进行读取:

但是,如果选择执行此操作,请删除
“\n”
换行符,否则
Long.parseLong()
无法正确解析输入字符串。最好只使用
.readLong()
.writeLong()
(因为您仍然在使用OIS/OOS);这样,您将完全避免处理字符串:

        lastId = fileIn.readLong();
...
fileOut.writeLong(nextId);

e.printStackTrace()
放在catch块中,首先查看更多详细信息。由于文件最初为空,因此始终会获得EOF。第一次运行代码时,它会创建文件(空),然后尝试读取它。然而,您的代码似乎是为了处理这种情况而编写的,所以您的问题并不清楚。你期望发生什么?文件
IDFile.txt
是什么样子的?我知道当文件为空时,它第一次会给出一个EOF,但是以后每次程序运行时,它都不应该给出EOF,因为文件不是空的,但它仍然会给出错误。该文件只有一行:
Ìw1549606
此字符串
“/Users/Timmy/Desktop/IDFile.txt”
看起来非常容易出错。您确定此路径指向正确的文件吗?您确实应该将同步添加到getInstance()方法中。这并不是导致问题的原因,但如果没有它,您的单例当前就不是线程安全的。非常感谢,这很有效!像往常一样,事后看来,知道自己做错了什么,我觉得自己很傻。。。关于硬编码文件路径:这只是为了测试。当我真正“真正”使用这个程序时,我会去掉它
        lastId = fileIn.readLong();
...
fileOut.writeLong(nextId);