java从文件读取对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java从文件读取对象相关的知识,希望对你有一定的参考价值。

我将int和String打包为一个对象,怎么输出至文件并读取呢,而且我将这些对象放在ArrayList中,怎么从文件中读取多个对象呢

可以使用 ObjectOutputStream 将对象写入文件中,使用 ObjectInputStream 类从文件中读取出对象。

代码如下:

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

class Person implements Serializable 

private static final long serialVersionUID = -3527230407404080537L;

private String name;

private int age;

public Person(String name, int age) 
this.name = name;
this.age = age;


public String getName() 
return name;


public void setName(String name) 
this.name = name;


public int getAge() 
return age;


public void setAge(int age) 
this.age = age;


@Override
public String toString() 
return "Person [name=" + name + ", age=" + age + "]";



public class App34 

public static void main(String[] args) throws IOException, ClassNotFoundException 

List<Person> persons = new ArrayList<>();

persons.add(new Person("张三", 20));
persons.add(new Person("李四", 25));

File file = new File("persons.data");

// 创建文件输出流
FileOutputStream output = new FileOutputStream(file);

// 创建对象输出流
ObjectOutputStream oOutput = new ObjectOutputStream(output);

// 将整个数组列表输出至文件
oOutput.writeObject(persons);

// 或者逐个将对象输出至文件,读取时需要逐个读取
/*for (Person p : persons) 
oOutput.writeObject(p);
*/

oOutput.close();
output.close();



// 创建文件输入流
FileInputStream input = new FileInputStream(file);

// 创建对象输入流
ObjectInputStream oInput = new ObjectInputStream(input);

// 读出整个对象列表
List<Person> persons2 = (List<Person>) oInput.readObject();

for (Person p : persons2) 
System.out.println(p);



// 或者逐个读取对象
/*Person p1 = null;
try 
while((p1 = (Person) oInput.readObject()) != null) 
System.out.println(p1);

 catch (EOFException e) 
System.out.println("读取对象结束");
*/

oInput.close();
input.close();

参考技术A readObject返回值为Object对象,从表面看我们只能读取一个序列化对象,但是数组也是Object对象,所以我们可以把序列化对象数组读取出来(List等集合框架也是好的选择),这样就可以实现读取多个对象。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test

public Test()
// 创建序列化的对象数组
MyData [] myDatas = new MyData[10];
// 通过循环构造每一个对象
for(int i = 0; i < myDatas.length; i++)
myDatas[i] = new MyData("数据:" + (i + 1));

// 对象将要保存的文件
File file = new File("C:/mydata.dat");
// 对象输出流
ObjectOutputStream out = null;
// 对象输入流
ObjectInputStream in = null;
try
// 将数组对象写入文件
out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(myDatas);
out.flush();
out.close();

// 将数组对象从文件中读取
in = new ObjectInputStream(new FileInputStream(file));
MyData [] datas = (MyData[]) in.readObject();
for (MyData myData : datas)
System.out.println(myData);

catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
catch (ClassNotFoundException e)
e.printStackTrace();



public static void main(String[] args)
new Test();




/**
* 序列化数据
*/
class MyData implements Serializable
private String text = null;

public MyData(String text)
this.text = text;


public String toString()
return text;


public String getText()
return text;


public void setText(String text)
this.text = text;


Java - 确定要从波形文件中读取以获取时间戳的字节数

【中文标题】Java - 确定要从波形文件中读取以获取时间戳的字节数【英文标题】:Java - Determine number of bytes to read from wave file to get to timestamp 【发布时间】:2015-05-11 03:50:37 【问题描述】:

我有一个AudioFormat 对象(从audioInputStream.getFormat() 返回)。我有一个时间戳(以毫秒为单位),我想从相应的 wav 文件中开始读取。如何确定从 AudioInputStream 读取/跳过多少字节才能到达适当的时间戳?

我对帧速率(以及它如何与采样率相关或不相关)感到困惑。

这是我目前所拥有的... startPos 是以毫秒为单位的时间戳。

float skipTotalFrames = audioInputStream.getFormat().getFrameRate() * (startPos / 1000);
long byteStartPos = (long) (audioInputStream.getFormat().getFrameSize() * skipTotalFrames);

我要去哪里?

编辑:我的代码确实有效,只是出现了其他错误。

【问题讨论】:

【参考方案1】:

WAV 格式通常以 44 字节标头开头,然后是每秒 44,100 次(采样率)采集的音频样本,其中每个样本是 16 位有符号整数小端(位深度)...比特率是通过将这两者相乘来计算的基本因素:(采样率)*(位深度)......这是单声道,所以如果立体声这些样本是交错的

查看您引用的 API,首先探测属性:vbr(可变比特率)如果它是真的,您想要的计算将无法实现。对于 WAV,它应该始终保持恒定的比特率(即错误)。然后检索属性:比特率

比特率 = (sample_rate) * (bit_depth) * (number_of_channels) === 每秒位数

For argument sake lets say your ...

sample_rate = 44100;  // 44.1 kHz which is typical
bit_depth = 16;       // also typical
number_of_channels = 2;  // mono --> 1   stereo --> 2

look_ahead_milli_sec = 1500; // you are given this in milliseconds

bit_rate = sample_rate * bit_depth * number_of_channels;
bit_rate = 44100 * 16 * 2;
bitrate = 1411200; // based on above calculation

bytes_per_second = bitrate / 8; // bits to bytes per sec
bytes_per_second = 1411200 / 8; // bits to bytes per sec
bytes_per_second = 176400; // bytes per sec

look_ahead_in_bytes = (bytes_per_second / 1000) * look_ahead_milli_sec;

look_ahead_in_bytes = (176400 / 1000) * 1500;    
look_ahead_in_bytes = 264600;

【讨论】:

据我了解,帧率相当于采样率。帧大小可以大于样本大小,因为它考虑了多个通道。这似乎是正确的? 有道理...通过实验验证轻松确认...在 Milli 第二次试验中运行几个起始位置...请告诉我们您的发现

以上是关于java从文件读取对象的主要内容,如果未能解决你的问题,请参考以下文章

Java 从 ZipEntry 对象中读取指定文件

java使用ObjectInputStream从文件中读取对象

如何从 Java 文件中读取许多 json 对象?

java如何从文件中读取对象并用set保存

Last.fm java.lang.ClassCastException - 从文件中读取用户对象

angular读取文件