java能否在内存里读写文件 请问各位大侠,java能否在内存里读写文件具体就是一个文件,写到内存(不保存到硬盘),然后再读取。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://topic.csdn.net/u/20070415/07/a5f4178f-c96d-4a7b-aac0-9ec324ae0a1c.html和你的要求类似 不知道楼主想干什么,既然是读写文件就是文件操作了.如果要在内存操作,就先把文件里的内容变成String或者btye数组,然后你想怎么弄就怎么弄和文件就没关系了.之所以要用文件流是因为怕文件太大,内存不够. nio 内存映射文件 应为我想把页面上显示的一些数据保存在excel里,但是不写到硬盘 FileInputStream fis = new FileInputStream(f); FileChannel fc = fis.getChannel(); // Get the file's size and then map it into memory int sz = (int)fc.size(); MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);通过nio中的类就行了 内存映射并不是把文件数据全部读入内存,只是分页技术。这是操作系统的模式,JAVA用自己的机制实现了这个模式的,但是还是受到系统的制约。小文件可以完全读入后操作,大文件,只能NIO ServletOutputStream out = response.getOutputStream();WritableWorkbook wwb = Workbook.createWorkbook(out);这个是将excel写到内存中后直接返回给客户端给用户下载!不知道你是不是要这个!数据量大的话还是建议已文件的形式! response.setHeader("pragma", "no-cache");response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO8859_1"));response.setContentType("application/*");最后还要加上这个! 只不是想产生临时文件,而实际操作时是往某上地方写的。等全部写完了再一次发给其它流,用ByteArrayOutputStream是最合适的。 既然都保存在 Excel 里了,还不写硬盘啊? 比如生成多媒体文件,多个文件进行编码,编码一点,写入一点,最后形成一个大的多媒体文件。写好后,再把这个文件输出去,现在楼主不想在硬盘上产生这个文件,因为发送到客户端后还要删除,并且临时文件命名,在多线程中是否会命名冲突等,所以直接在内存中操作。ByteArrayOutputStream 生成一个out,你直接往里写(前题是不能太大超过JVM能分配的内存),写完后直接转换成byte[],或和一个ByteArrayInputStreamr挂接从里读再往客户端发送。 楼主看来根本没了解什么叫做数据。从java的角度去思考数据,任何数据都是byte数组,你存放在内存中是byte,存放在硬盘里面也是byte,什么inputStream,什么outputStream不过是对这些byte类型进行转移或者处理,充其量就是把内存中的这些byte存放到硬盘中又或者吧硬盘中的byte存放在内存中。 生成的 Excel 文件,并不一定要存到 File 里面去啊,可以写入 ByteArrayOutputStream 存成一个 byte 数组import java.io.ByteArrayOutputStream;import java.io.IOException;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRichTextString;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class HssfTest { public static void main(String[] args) { HSSFWorkbook hssf = new HSSFWorkbook(); HSSFSheet sheet = hssf.createSheet("你好"); for(int i = 0; i < 10; i++) { HSSFRow row = sheet.createRow(i); for(int j = 0; j < 10; j++) { HSSFCell cell = row.createCell(j); HSSFRichTextString str = new HSSFRichTextString(i + ", " + j); cell.setCellValue(str); } } ByteArrayOutputStream os = null; try { os = new ByteArrayOutputStream(); hssf.write(os); } catch (IOException e) { e.printStackTrace(); } finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } byte[] bys = os.toByteArray(); }} 操作系统提供了映射文件等,不记得java是否提供了封装。 WEB工程?放到SESSION里好了,什么时用什么时取,你机器可要好。 字节的:ByteArrayOutputStream.字符的:CharArrayWriter 序列化传输不同步 java虚拟机 linux(i18n文件已经改了)中文还乱码,上面装的mysql也是。 关于利用递归求给定字符串的全排列 一句SQL语句的问题 编一个JAVA小程序 请教Jini故障转移和负载平衡的问题。 [求助]请高手们帮忙 为什么窗口无法显示 java基本语法、API问题。 数组面试题: 今天去面试不会啊 郁闷 大哥们帮解决一下 求问Java多进程的问题
和你的要求类似
如果要在内存操作,就先把文件里的内容变成String或者btye数组,然后你想怎么弄就怎么弄和文件就没关系了.之所以要用文件流是因为怕文件太大,内存不够.
应为我想把页面上显示的一些数据保存在excel里,但是不写到硬盘
FileChannel fc = fis.getChannel(); // Get the file's size and then map it into memory
int sz = (int)fc.size();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
通过nio中的类就行了
小文件可以完全读入后操作,大文件,只能NIO
WritableWorkbook wwb = Workbook.createWorkbook(out);这个是将excel写到内存中后直接返回给客户端给用户下载!
不知道你是不是要这个!数据量大的话还是建议已文件的形式!
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO8859_1"));
response.setContentType("application/*");最后还要加上这个!
用ByteArrayOutputStream是最合适的。
既然都保存在 Excel 里了,还不写硬盘啊?
从java的角度去思考数据,任何数据都是byte数组,你存放在内存中是byte,存放在硬盘里面也是byte,什么inputStream,什么outputStream不过是对这些byte类型进行转移或者处理,充其量就是把内存中的这些byte存放到硬盘中又或者吧硬盘中的byte存放在内存中。
import java.io.IOException;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class HssfTest { public static void main(String[] args) {
HSSFWorkbook hssf = new HSSFWorkbook();
HSSFSheet sheet = hssf.createSheet("你好");
for(int i = 0; i < 10; i++) {
HSSFRow row = sheet.createRow(i);
for(int j = 0; j < 10; j++) {
HSSFCell cell = row.createCell(j);
HSSFRichTextString str = new HSSFRichTextString(i + ", " + j);
cell.setCellValue(str);
}
}
ByteArrayOutputStream os = null;
try {
os = new ByteArrayOutputStream();
hssf.write(os);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
byte[] bys = os.toByteArray();
}
}
你机器可要好。
字符的:CharArrayWriter