java的File类的对象是可序列化的吗?

Posted

技术标签:

【中文标题】java的File类的对象是可序列化的吗?【英文标题】:Is java's File class' object serializable? 【发布时间】:2014-09-24 06:08:46 【问题描述】:

我正在做一个项目,它需要将目录信息从一个客户端发送到网络上的另一个客户端。所以告诉我,我可以通过仅发送 File 类的对象来在另一个客户端上获取此信息吗?请解释一下你是或否的原因。

更新问题

我正在发布我尝试过的代码......

客户代码:-

public class FileClient
    public static void main(String str[])
        try
            Socket sock = new Socket("10.16.10.82",4000);

                    /* Socket sock = new Socket("127.0.0.1",4000); */ //for localhost 
            File f = new File("MyFile.txt");
            ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream());
            os.writeObject(f);
            os.flush();
            os.close();
            System.out.println("object sent");
        
        catch(Exception ex)
            ex.printStackTrace();

        

    

以下是服务器代码:-

class FileServer
    public static void main(String str[])
        try
            ServerSocket sock = new ServerSocket(4000);
            while(true)
                Socket cs = sock.accept();
                ObjectInputStream in = new ObjectInputStream(cs.getInputStream());
                File f = (File)in.readObject();
                System.out.println(f.isDirectory());
                System.out.println(f.length()+" bytes read");
            
        
        catch(Exception ex)
            ex.printStackTrace();

        

    

如果我在 localhost 上运行服务器,这可以正常工作,但是当我使用两台不同的机器时,一台用于客户端,另一台用于服务器,输出不同(它显示读取 0 字节)。这似乎是正确的,因为实际文件在远程服务器上不可用。我对 File 类的字段感到困惑,即

static private FileSystem fs = FileSystem.getFileSystem() //see javadoc for File

服务器在读取 File 对象后得到了什么确切的信息?

【问题讨论】:

基于JavaDocs for File,是的。话虽如此,我非常不鼓励通过网络发送File,因为它与本地机器相关。最好设计自己的课程来携带您需要的信息 - 恕我直言 另外,您为什么不直接使用ObjectOutputStream 并尝试将File 对象写入磁盘,看看发生了什么? 非常感谢,我一定会试试的。为什么我不这么认为:-) 更重要的是,您为什么不查看 Javdoc?就已经记录在案的问题在互联网上提问是没有意义的。完全是浪费时间。 仅供参考,File 对象只不过是文件路径周围的薄包装。 【参考方案1】:

是的,您可以使用File 类引用发送信息,因为它实现了Serializable 接口。

有关更多详细信息,请阅读 Java 的 FileAPI reference。

代码示例

可以通过以下代码实现:

String sourcePathFilename = "path.txt";
try 
    File file = new File(sourcePathFilename);
    FileOutputStream fos = new FileOutputStream(String targetpath);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(file);
 catch (Exception e) 
    e.printStackTrace();

【讨论】:

以上是关于java的File类的对象是可序列化的吗?的主要内容,如果未能解决你的问题,请参考以下文章

序列化反序列化(实体类或要序列化的对象类必须实现Serializable接口)

java 序列化机制深度解析

014.序列化与反序列化

Java基础IO

Java基础IO

从零开始的Java开发1-6-4 Java输入输出流:File类绝对路径和相对路径字节流缓冲流字符流对象序列化