【问题标题】:Mysterious FileNotFoundException神秘的 FileNotFoundException
【发布时间】:2013-08-13 21:05:25
【问题描述】:

我正在编写一个与运行 servlet 的 Tomcat 服务器通信的 Android 应用程序。我正在对 Tomcat 服务器进行 POST,指定我希望服务器将什么文件发送回客户端(Android 应用程序)。当我尝试通过将随 POST 发送的文件名添加到目录名称来打开此文件时,我收到 FileNotFoundException。但是硬编码完全相同的文件名就可以了。

从Tomcat服务器控制台抛出FileNotFoundException时获得的文件路径复制粘贴到Windows资源管理器中打开正确的文件。我还将硬编码文件路径和将文件名附加到目录路径的路径写入日志文件。在这个日志文件中,两个文本看起来完全一样,将它们复制粘贴到 Windows 资源管理器中会打开正确的文件。有人知道为什么会产生 FileNotFoundException 吗?

从客户端发帖

String potentialIP = "http://"+url+":8080/se.myPage/myServlet";
URL url = new URL(potentialIP);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setChunkedStreamingMode(0);

// Starts the query
conn.connect();

OutputStream out = new BufferedOutputStream(conn.getOutputStream());
byte[] byteArray = korning.getBytes();
out.write(byteArray);
out.flush();

而服务器端的doPost方法是这样的

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream in = request.getInputStream();
    java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A");

    String fileName = s.hasNext() ? s.next() : "";
    String filePath = "C:/myCatalog/"+fileName;

    PrintWriter out = response.getWriter();

    PrintWriter writer = new PrintWriter("C:/myCatalog/Servletlog.txt", "UTF-8");
    writer.write("'"+"C:/myCatalog/hardCodedFileName.txt"+"'");
    writer.write("'"+filePath+"'");
    writer.flush();
    writer.close();

    BufferedReader reader = new BufferedReader(new FileReader(filePath));

    String svar = reader.readLine();
    reader.close();     
    out.close();
}

有人知道如何解决这个问题吗?

【问题讨论】:

  • 我建议发布日志文件。另外,我猜你不需要文件路径中 myCatalog 前面的空间。那可能是你的问题 -> C:/myCatalog/hardCodedFileName.txt
  • 你指的是Tomcat日志文件还是我用PrintWriter制作的那个?不明白你说的是什么空间?如果您的意思是“'”,那么它的存在是有原因的——确保没有换行符或空格把事情搞砸了..
  • 所以您是说服务器无法打开文件进行读取,因此它可以将内容返回给客户端? corning 变量在您的客户端中包含什么?
  • @wea 我编辑了空间。它应该只影响您的日志记录。在这一行中有一个额外的空格:writer.write("'"+"C:/myCatalog/hardCodedFileName.txt"+"'");,位于路径的 C:/ 和 myCatalog/ 部分之间。跨度>
  • 更好的korning.getBytes("UTF-8");new BufferedReader(new ÌnputStreamReader(new FileInputStream(filePath), "UTF-8"); 否则默认平台编码。

标签: java android tomcat servlets


【解决方案1】:

对我来说,事实证明无论默认用户代理是什么(可能什么都没有),服务器都会阻止并返回403。这在我的尝试中抛出了FileNotFoundException。然后我从另一台服务器更改为示例 json:http://date.jsontest.com/ 这将返回一个如下所示的 json:

{
   "time": "05:58:38 AM",
   "milliseconds_since_epoch": 1400047118645,
   "date": "05-14-2014"
}

通过切换到另一台服务器,一切正常 - 后来我发现(如上所述)用户代理存在问题 - 将其设置为类似于 Chrome 用户代理的东西,它也应该可以正常工作。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2014-06-05
    • 2018-11-28
    • 2010-11-12
    • 2022-01-13
    相关资源
    最近更新 更多