读入 XML 到文件 Java
Posted
技术标签:
【中文标题】读入 XML 到文件 Java【英文标题】:Read in XML to file Java 【发布时间】:2011-12-19 00:20:58 【问题描述】:我有一个服务器,它接受一个 WSDL 请求并逐行发回 WSDL 的 XML。我知道请求正在被正确接收和处理,因为我让服务器在写入服务器套接字时将 XML 打印到控制台。我现在的问题是我的客户端应用程序应该在 xml 中读取,然后使用 xml 打印出方法签名。我将使用 DOM / DocumentBuilder 从 WSDL 获取方法签名的部分,但我需要首先将读入的行放入文件中。我怎样才能做到这一点?目前我正在尝试这样做:
//request WSDL from server
System.out.println("Client requesting \"MathServices?wsdl\"...");
socketWriter.write("GET MathServices?wsdl");
socketWriter.close();
//read XML response into file
try
File wsdlXML = new File("MathServices.xml");
FileOutputStream wsdlXmlWriter = new FileOutputStream(wsdlXML);
String xmlLine;
while((xmlLine = socketReader.readLine()) != null)
wsdlXmlWriter.write(xmlLine.getBytes());
catch (IOException e)
e.printStackTrace();
但是我得到了这个错误:
客户端请求“MathServices?wsdl”... java.net.SocketException:套接字关闭 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(SocketInputStream.java:129) 在 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 在 sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 在 sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 在 java.io.InputStreamReader.read(InputStreamReader.java:167) 在 java.io.BufferedReader.fill(BufferedReader.java:136) 在 java.io.BufferedReader.readLine(BufferedReader.java:299) 在 java.io.BufferedReader.readLine(BufferedReader.java:362) 在 client.Client.main(Client.java:50)
编辑:服务器代码
package server;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
public class RequestHandler extends Thread
Object block;
ServerSocket serverSocket;
BufferedReader socketReader;
PrintWriter socketWriter;
public RequestHandler(Object block, ServerSocket serverSocket)
this.block = block;
this.serverSocket = serverSocket;
@Override
public void run()
try
System.out.println("Waiting for connection...");
Socket clientSocket = serverSocket.accept();
System.out.println("Connection made.");
synchronized(block)
System.out.print("Notifying server thread...");
block.notify();
System.out.println("...done");
System.out.println();
System.out.println("Setting up streams...");
socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
socketWriter = new PrintWriter(clientSocket.getOutputStream(), true);
System.out.println("Reading request");
String input;
while((input = socketReader.readLine()) != "\n")
//System.out.println("Input: " +input);
if(input.startsWith("GET"))
System.out.println("GET received.");
getResource(input);
socketWriter.close();
socketReader.close();
clientSocket.close();
System.out.println("Streams closed.");
catch(IOException e)
System.out.println("IOException!");
e.printStackTrace();
public void getResource(String getRequest)
String[] parts = getRequest.split("\\s+");
String filename = parts[1].substring(1);
if(filename.equals("MathServices?wsdl"))
filename = "MathServices.wsdl";
System.out.println(filename);
File resource = new File(filename);
sendResponse(resource, 1);
public void sendResponse(File resource, int type)
System.out.println(resource.getAbsolutePath());
Scanner fileReader;
try
fileReader = new Scanner(resource);
while(fileReader.hasNext())
String line = fileReader.nextLine();
System.out.println(line);
socketWriter.println(line);
socketWriter.println("\n");
System.out.println("end of response");
socketWriter.close();
catch (FileNotFoundException e)
System.out.println("File not found!");
e.printStackTrace();
【问题讨论】:
【参考方案1】:看起来您在阅读 socketReader
之前要关闭 Socket
。在关闭Socket
之前,您必须完全读取该对象的结果。这是所有的代码吗?您也可以尝试在关闭之前添加socketWriter.flush()
。
编辑:
我注意到您正在向服务器发送GET
请求,大概是打算发出HTTP GET
?如果是这样,您的请求格式不正确。试试这个:
socketWriter.write("GET /MathServices?wsdl HTTP/1.1\r\n\r\n");
您最好使用 java.net.URLConnection
或 Apache HttpClient 来完成此任务。
【讨论】:
这不是所有的代码,但我认为其余的与这个特定部分无关。顺便说一下,我的 socketReader 设置为自动刷新。至于关闭,如果我不在那里关闭 socketWriter,那么我的请求永远不会完成对服务器的写入,并且没有任何东西被发回。它会一直挂在那里,直到套接字关闭。 我想我现在看到了问题所在。我正在修改我的答案。 很抱歉不清楚,但我开发了服务器。这有点令人费解,但基本上它只接受来自客户端的任何输入,如果它以“GET”开头,那么它会将空格后面的部分解析为文件名。它(服务器)然后将该文件名传递给 sendResponse()方法逐行读取文件,然后将其写入服务器套接字的输出。然后客户端应该逐行读取该输出并将这些行写入一个新文件,制作一个用于 DOM 的 XML 文件。 我明白了。在没有看到服务器代码的情况下,看起来服务器在完成写入响应之前就关闭了自己的套接字。以上是关于读入 XML 到文件 Java的主要内容,如果未能解决你的问题,请参考以下文章