Java中如何通过txt文件存储和取出数据?

Python014

Java中如何通过txt文件存储和取出数据?,第1张

Java中读取txt文件可以使用file类先创建一个对象,然后使用I/O操作,进行读取或者写入操作,示例如下:\x0d\x0aimportjava.io.BufferedReader\x0d\x0aimportjava.io.File\x0d\x0aimportjava.io.FileInputStream\x0d\x0aimportjava.io.FileNotFoundException\x0d\x0aimportjava.io.FileOutputStream\x0d\x0aimportjava.io.IOException\x0d\x0aimportjava.io.InputStreamReader\x0d\x0aimportjava.io.PrintWriter\x0d\x0a\x0d\x0apublicclassdemo2{\x0d\x0aprivatestaticStringpath="f:/demo1.txt"\x0d\x0aprivatestaticFilefile\x0d\x0astatic{\x0d\x0afile=newFile(path)\x0d\x0aif(!file.exists()){\x0d\x0atry{\x0d\x0afile.createNewFile()\x0d\x0a}catch(IOExceptione){\x0d\x0ae.printStackTrace()\x0d\x0a}\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0apublicstaticvoidmain(String[]args)throwsIOException{\x0d\x0aStudentstu=newStudent(1,"张三",90)\x0d\x0awriteDataToFile(file,stu)\x0d\x0areadDataFromFile(file)\x0d\x0a}\x0d\x0a\x0d\x0aprivatestaticvoidreadDataFromFile(Filefile)throwsIOException{\x0d\x0aBufferedReaderreader=newBufferedReader(newInputStreamReader(newFileInputStream(file)))\x0d\x0aStringstr=""\x0d\x0awhile((str=reader.readLine())!=null){\x0d\x0aString[]stuInfo=str.split(",")\x0d\x0aSystem.out.println("学号:"+stuInfo[0]+"姓名:"+stuInfo[1]+"score:"+stuInfo[2])\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0aprivatestaticvoidwriteDataToFile(Filefile,Studentstu)throwsFileNotFoundException{\x0d\x0aPrintWriterout=newPrintWriter(newFileOutputStream(file,true))\x0d\x0aout.println(stu.toString())\x0d\x0aout.close()\x0d\x0a}\x0d\x0a}

如果您在 Microsoft Windows 环境中工作 那么创建位图文件的功能将为您提供许多方便 例如 在我的上一个项目中 我必须将 Java 与 Microsoft Access 对接 Java 程序允许用户在屏幕上绘图 这幅图随后被打印到 Microsoft Access 报表中 由于 Java 不支持 OLE 我的唯一选择就是创建该图的一个位图文件 并通知 Microsoft Access 报表在何处能找到这个位图文件 如果您写过向剪贴板发送图像的应用程序 则这个技巧可能对您有用 尤其是当您将这个信息传递给另一个应用程序时 位图文件的格式 位图文件格式支持 位 RLE(行程长度编码)以及 位和 位编码 因为我们只处理 位格式 所以下面我们查看一下该文件的结构 位图文件分为三个部分 我已将它们列在下面 第 部分 位图文件的标头 标头包含位图文件的类型大小信息和版面信息 结构如下(摘自 C 语言结构定义) typedef struct tagBITMAPFILEHEADER {牋燯INT bfType牋燚WORD bfSize牋燯INT bfReserved 牋燯INT bfReserved 牋燚WORD bfOffBits}BITMAPFILEHEADER下面是对这个清单中的代码元素的说明 bfType 指定文件类型 其值始终为 BM bfSize 指定整个文件的大小(以字节为单位) bfReserved 保留 必须为 bfReserved 保留 必须为 bfOffBits 指定从 BitmapFileHeader 到图像首部的字节偏移量 现在您已经明白位图标头的用途就是标识位图文件 读取位图文件的每个程序都使用位图标头来进行文件验证 第 部分 位图信息标头 随后的标头称为信息标头 其中包含图像本身的属性 下面说明如何指定 Windows (或更高版本)设备独立位图 (DIB) 的大小和颜色格式: typedef struct tagBITMAPINFOHEADER {牋牋DWORD biSize牋牋LONG biWidth牋牋LONG biHeight牋牋WORD biPlanes牋牋WORD biBitCount牋牋DWORD biCompression牋牋DWORD biSizeImage牋牋LONG biXPelsPerMeter牋牋LONG biYPelsPerMeter牋牋DWORD biClrUsed牋牋DWORD biClrImportant} BITMAPINFOHEADER以上代码清单的每个元素说明如下 biSize 指定 BITMAPINFOHEADER 结构所需的字节数 biWidth 指定位图的宽度(以象素为单位) biHeight 指定位图的高度(以象素为单位) biPlanes 指定目标设备的位面数 这个成员变量的值必须为 biBitCount 指定每个象素的位数 其值必须为 或 biCompression 指定压缩位图的压缩类型 在 位格式中 该变量被设置为 biSizeImage 指定图像的大小(以字节为单位) 如果位图的格式是 BI_RGB 则将此成员变量设置为 是有效的 biXPelsPerMeter 为位图指定目标设备的水平分辨率(以 象素/米 为单位) 应用程序可用该值从最符合当前设备特征的资源群组中选择一个位图 biYPelsPerMeter 为位图指定目标设备的垂直分辨率(以 象素/米 为单位) biClrUsed 指定位图实际所用的颜色表中的颜色索引数 如果 biBitCount 设为 则 biClrUsed 指定用来优化 Windows 调色板性能的参考颜色表 biClrImportant 指定对位图的显示有重要影响的颜色索引数 如果此值为 则所有颜色都很重要 现在已定义了创建图像所需的全部信息 第 部分 图像 在 位格式中 图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示 每个扫描行都被补足到 位 为了使这个过程稍复杂一点 图像是自底而上存储的 即第一个扫描行是图像中的最后一个扫描行 下图显示了标头 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分图像 各个部分由垂线分隔 D B | E B EC EC | FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF*现在 我们开始检视代码 现在我们已经知道了 位位图文件的结构 下面就是您期待已久的内容 用来将图像对象写入位图文件的代码 import java awt *import java io *import java awt image *public class BMPFile extends Component {牋// 私有常量牋private final static int BITMAPFILEHEADER_SIZE = 牋private final static int BITMAPINFOHEADER_SIZE = 牋// 私有变量声明牋// 位图文件标头牋private byte bitmapFileHeader [] = new byte [ ]牋private byte bfType [] = { B M }牋private int bfSize = 牋private int bfReserved = 牋private int bfReserved = 牋private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE牋// 位图信息标头牋private byte bitmapInfoHeader [] = new byte [ ]牋private int biSize = BITMAPINFOHEADER_SIZE牋private int biWidth = 牋private int biHeight = 牋private int biPlanes = 牋private int biBitCount = 牋private int biCompression = 牋private int biSizeImage = x 牋private int biXPelsPerMeter = x 牋private int biYPelsPerMeter = x 牋private int biClrUsed = 牋private int biClrImportant = 牋// 位图原始数据牋private int bitmap []牋// 文件部分牋private FileOutputStream fo牋// 缺省构造函数牋public BMPFile() {牋}牋public void saveBitmap (String parFilename Image parImage intparWidth int parHeight) {牋牋炉ry {牋牋牋牋fo = new FileOutputStream (parFilename)牋牋牋牋save (parImage parWidth parHeight)牋牋牋牋fo close ()牋牋爙牋牋焘atch (Exception saveEx) {牋牋牋牋saveEx printStackTrace ()牋牋爙牋}牋/*牋? saveMethod 是该进程的主方法 该方法牋? 将调用 convertImage 方法以将内存图像转换为牋? 字节数组 writeBitmapFileHeader 方法创建并写入牋? 位图文件标头 writeBitmapInfoHeader 创建 牋? 信息标头 writeBitmap 写入图像 牋?牋?/牋private void save (Image parImage int parWidth int parHeight) {牋牋炉ry {牋牋牋牋convertImage (parImage parWidth parHeight)牋牋牋牋writeBitmapFileHeader ()牋牋牋牋writeBitmapInfoHeader ()牋牋牋牋writeBitmap ()牋牋爙牋牋焘atch (Exception saveEx) {牋牋牋牋saveEx printStackTrace ()牋牋爙牋}牋/*牋? convertImage 将内存图像转换为位图格式 (BRG) 牋? 它还计算位图信息标头所用的某些信息 牋?牋?/牋private boolean convertImage (Image parImage int parWidth int parHeight) {牋牋爄nt pad牋牋燽itmap = new int [parWidth * parHeight]牋牋燩ixelGrabber pg = new PixelGrabber (parImage parWidth parHeight 牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋燽itmap parWidth)牋牋炉ry {牋牋牋牋pg grabPixels ()牋牋爙牋牋焘atch (InterruptedException e) {牋牋牋牋e printStackTrace ()牋牋牋牋return (false)牋牋爙牋牋爌ad = ( ((parWidth * ) % )) * parHeight牋牋燽iSizeImage = ((parWidth * parHeight) * ) + pad牋牋燽fSize = biSizeImage + BITMAPFILEHEADER_SIZE +BITMAPINFOHEADER_SIZE牋牋燽iWidth = parWidth牋牋燽iHeight = parHeight牋牋爎eturn (true)牋}牋/*牋? writeBitmap 将象素捕获器返回的图像转换为牋? 所需的格式 请记住 扫描行在位图文件中是牋? 反向存储的!牋?牋? 每个扫描行必须补足为 个字节 牋?/牋private void writeBitmap () {牋牋牋int size牋牋牋int value牋牋牋int j牋牋牋int i牋牋牋int rowCount牋牋牋int rowIndex牋牋牋int lastRowIndexlishixinzhi/Article/program/Java/JSP/201311/19219

对于一些小文件,我们可以一次性读取它的所有字节,然后一次提交到数据库

///

/// 这个方法演示了如何一次提交所有的字节。这样导致的结果是:应用程序立即需要申请等同于文件大小的内存

static void SubmitFileByOnce() {

string file = @"F:\功夫熊猫.rmvb"//文件大小为519MB

byte[] buffer = File.ReadAllBytes(file)

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true")) {

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

new SqlParameter("@fileContents",buffer)

})

conn.Open()

cmd.ExecuteNonQuery()

conn.Close()

}

}

}

但是,上面的方法有几个问题,主要体现在如果文件比较大的话

它需要一次性很大的内存,具体数据等同于文件大小。因为File.ReadAllBytes方法是将所有字节全部读入到内存。

它会导致提交失败,就是因为数据太大了。数据库也会拒绝。

那么,我就对这个方法做了一下改进,将文件拆分为5MB一段,也就是说,此时每次申请的内存只有5MB。这就大大地提高了可用性。

/// 这个方法是将文件切分为5MB的块,每次只是提交5MB,所以可能多次提交,但内存占用就比较小

static void SubmitFileStepByStep() {

string file = @"F:\功夫熊猫.rmvb"//以这个文件为例,大小为519MB,一共需要的时间大约94秒。还是有点慢的,所以还可能需要进行压缩

FileStream fs = new FileStream(file, FileMode.Open)

byte[] buffer = new byte[5 * 1024 * 1024]

int readCount

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true"))

{

conn.Open()

while ((readCount = fs.Read(buffer, 0, buffer.Length)) >0)

{

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

new SqlParameter("@fileContents",buffer)

})

cmd.ExecuteNonQuery()

}

}

conn.Close()

}

}

这样的话,有一个后果就是一个文件,可能在数据库中会有多条记录。所以在读取的时候,我们需要对其进行合并

static void DownloadFile() {

string file = @"F:\功夫熊猫.rmvb"

string destfile = @"E:\Temp\Temp.wmv"

using (SqlConnection conn = new SqlConnection("server=(local)database=demointegrated security=true"))

{

using (SqlCommand cmd = conn.CreateCommand())

{

cmd.CommandText = "SELECT FileContents FROM Files WHERE FileName=@fileName"

cmd.Parameters.AddRange(

new[]

{

new SqlParameter("@fileName",file),

})

conn.Open()

SqlDataReader reader = cmd.ExecuteReader()

FileStream fs = new FileStream(destfile, FileMode.Append, FileAccess.Write)

while (reader.Read())

{

byte[] buffer = (byte[])reader[0]

fs.Write(buffer, 0, buffer.Length)

}

fs.Close()

reader.Close()

conn.Close()

}

}

}