2012-01-27 17 views
6

Tôi có một đối tượng HttpServletResponse và cần phải viết một tập tin chứa trong bình. Các đoạn mã sau không hoạt động đối với tôi.HttpServletResponse PrintWriter để viết InputStream

URI uri = <myclass>.class.getResource("/" + filename).toURI(); 
PrintWriter out = response.getWriter(); 
File f = new File(uri); 
FileReader bis = new FileReader(f); 
char[] buff = new char[1024]; 
int bytesRead; 
// Simple read/write loop. 
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 
    out.write(buff, 0, bytesRead); 
} 

Tôi biết rằng điều này sẽ làm việc

InputStream inputStream = <myclass>.class.getResourceAsStream("/" + filename); 

nhưng tôi không thể có được out.write PrintWriter để viết InputStream.

Bất kỳ ai cũng có thể cho tôi biết cách thực hiện điều này.

Cảm ơn

+0

xin lỗi, cần phải đọc một tập tin đó nằm trong lọ, một file resource. – user815809

Trả lời

4

giải quyết bằng cách sử dụng sau đây

InputStream inputStream = KCSSchemaController.class.getResourceAsStream("/" + schemaname); 

OutputStream output = response.getOutputStream(); 

ByteStreams.copy(inputStream, output); 

output.flush(); 
0

cần phải viết một tập tin chứa trong lọ.

Điều đó là không thể theo cách này. Về cơ bản bạn cần lấy đường dẫn hệ thống tệp đĩa tuyệt đối vào tệp JAR, giải nén nó bằng cách sử dụng JarInputStream (một tệp JAR về cơ bản là tệp ZIP theo cấu trúc thư mục cụ thể và được điều trị đặc biệt bằng Java), chỉnh sửa/thêm tệp vào cấu trúc thư mục được trích xuất và sau đó đóng gói lại bằng cách sử dụng JarOutputStream. Bạn có thể cần phải tải lại nó sau đó bằng cách sử dụng (tùy chỉnh) ClassLoader nếu bạn cần các nội dung JAR đã thay đổi sau này trong thời gian chạy.

Điều này tuy nhiên khá phức tạp và không có ý nghĩa. Là một thay thế hoàn toàn khác, không cố gắng thay đổi JAR, nhưng chỉ lưu trữ dữ liệu ở một nơi khác, ví dụ: trên vị trí cố định trên hệ thống tệp đĩa hoặc trong cơ sở dữ liệu hoặc tùy chọn người dùng/hệ thống, v.v. Cách nào để lựa chọn phụ thuộc vào yêu cầu chức năng cụ thể mà không rõ ràng từ câu hỏi.

+0

xin lỗi, cần phải đọc một tệp nằm trong tệp jar, tệp tài nguyên. – user815809

+0

Nếu bạn chỉ cần * đọc * nó (không phải để viết nó!), Chỉ cần sử dụng 'ClassLoader # getResourseAsStream()' theo cách thông thường. – BalusC