- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi đã viết phần phụ trợ InputStream
(和 Luồng đầu ra
) để bao bọc các luồng khác và đọc trước trên một luồng nền, về cơ bản cho phép quá trình giải nén/nén xảy ra trên một luồng khác đang xử lý luồng được giải nén.
Đây là mô hình nhà sản xuất/người tiêu dùng khá chuẩn.
Đây có vẻ như là một cách đơn giản để tận dụng CPU đa lõi với quy trình đọc, xử lý và ghi dữ liệu đơn giản, cho phép sử dụng tài nguyên CPU và ổ đĩa hiệu quả hơn. Có lẽ "hiệu quả" không phải là từ phù hợp nhất, nhưng nó cũng giống như trực tiếp từ ZipĐầu VàoLuồng
Đọc và viết trực tiếp Nó cung cấp mức sử dụng cao hơn so với ZipOutputStream và tôi quan tâm nhiều hơn đến thời gian chạy giảm
.
Tôi rất vui khi đăng mã, nhưngCâu hỏi của tôi là tôi có đang phát minh lại thứ gì đó đã có sẵn trong thư viện hiện có (và được sử dụng thường xuyên hơn) không?
EDIT - Mã đã đăng...
我的 NềnĐầu VàoLuồng
Mã như sau (NềnĐầu raLuồng
Rất giống), nhưng tôi muốn cải thiện một số khía cạnh của nó.
NềnĐầu VàoLuồng
trích dẫn,nềnĐọcChủ đề
sẽ treo mãi mãi.ôi
Tín hiệu cần cải thiện.Người thi hành
chủ đề.close()
Phương thức này sẽ báo hiệu luồng nền và không được đóng luồng trình bao bọc vì luồng trình bao bọc phải được sở hữu bởi luồng nền đọc nó.gói nz.co.datcut.io;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
nhập java.util.concurrent.LinkedBlockingQueue;
lớp công khai BackgroundInputStream mở rộng inputStream {
int tĩnh cuối cùng DEFAULT_QUEUE_SIZE = 1;
int tĩnh cuối cùng DEFAULT_BUFFER_SIZE = 64*1024;
int cuối cùng riêng tưKích thước;
bộ đệm int cuối cùng riêng tưKích thước;
boolean dễ bay hơi riêng tư eof = false;
riêng tư LinkedBlockingQueue bufferQueue;
cuối cùng riêng tư được bọcInputStream;
byte riêng tư[] currentBuffer;
byte dễ bay hơi riêng tư [] freeBuffer;
vị trí int riêng tư;
public BackgroundInputStream(InputStream bọcInputStream) {
cái này (wrappedInputStream, DEFAULT_QUEUE_SIZE, DEFAULT_BUFFER_SIZE);
}
public BackgroundInputStream(InputStream được bọcInputStream,int queueSize,int bufferSize) {
this.wrappedInputStream = bọcInputStream;
this.queueSize = queueSize;
this.bufferSize = bufferSize;
}
@Ghi đè
public int read() ném IOException {
if (bufferQueue == null) {
bufferQueue = new LinkedBlockingQueue(queueSize);
BackgroundReader nềnReader = new BackgroundReader();
Chủ đề nềnReaderThread = Chủ đề mới (backgroundReader, "Background inputStream");
nềnReaderThread.start();
}
if (currentBuffer == null) {
thử {
if ((!eof) || (bufferQueue.size() > 0)) {
currentBuffer = bufferQueue.take();
vị trí = 0;
} khác {
return -1;
}
} bắt (InterruptedException e) {
e.printStackTrace();
}
}
int b = currentBuffer[pos++];
if (pos == currentBuffer.length) {
freeBuffer = currentBuffer;
currentBuffer = null;
}
return b;
}
@Ghi đè
public int available() ném IOException {
if (currentBuffer == null) trả về 0;
trả về currentBuffer.length;
}
@Ghi đè
public void close() ném IOException {
WrapInputStream.close();
currentBuffer = null;
freeBuffer = null;
}
lớp BackgroundReader triển khai Runnable {
@Ghi đè
công khai void run() {
thử {
trong khi (!eof) {
byte[] newBuffer;
if (freeBuffer != null) {
newBuffer = freeBuffer;
freeBuffer = null;
} khác {
newBuffer = byte mới[bufferSize];
}
int byteRead = 0;
int writeToBuffer = 0;
while (((bytesRead = WrapInputStream.read(newBuffer, writeToBuffer, bufferSize - writeToBuffer)) != -1) && (writingToBuffer < bufferSize)) {
writeToBuffer += byteRead;
}
if (viếtToBuffer > 0) {
if (writeToBuffer < bufferSize) {
newBuffer = Arrays.copyOf(newBuffer, writeToBuffer);
}
bufferQueue.put(newBuffer);
}
nếu (byteRead == -1) {
eof = đúng;
}
}
} catch (IOException e) {
e.printStackTrace();
} bắt (InterruptedException e) {
e.printStackTrace();
}
}
}
}
câu trả lời hay nhất
Nghe có vẻ thú vị. Tôi chưa bao giờ thấy bất cứ thứ gì hoạt động tốt, nhưng sẽ rất có ý nghĩa nếu thử sử dụng lõi nhàn rỗi để nén nếu có.
có lẽ bạn có thể tận dụng I/O chung - Đây là một thư viện đã được thử nghiệm kỹ lưỡng, giúp giải quyết một số nội dung nhàm chán hơn, cho phép bạn tập trung vào việc mở rộng quy mô các phần song song thú vị. Có lẽ bạn thậm chí có thể đóng góp mã của mình cho dự án Commons ;-)
Về triển khai Java - nền đệm được đệm, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/2153911/
Tôi có hai phương thức trong một lớp: Private static inputStream getSongStream(String ip, String id){ try { U
Tôi đã tạo một lớp mới mở rộng inputStream và phải @Override read(). Tôi đang cố gắng sử dụng phương thức read(int b) nhưng khi tôi sử dụng nó lại chuyển sang phương thức read() và tôi không thể sử dụng các tham số, tôi
Tôi đang cố gắng viết một hàm sẽ chấp nhận một Dòng đầu vào có dữ liệu tệp nén và trả về một Dòng đầu vào khác có dữ liệu được giải nén. File nén sẽ chỉ chứa một file nên không cần tạo thư mục, v.v... Tôi đã thử
Tôi tự hỏi liệu có cách lý tưởng nào để xâu chuỗi nhiều luồng đầu vào thành một luồng đầu vào liên tục trong Java (hoặc Scala) hay không. Tôi cần nó để phân tích các tệp phẳng mà tôi tải qua mạng từ máy chủ FTP.
Điều tôi muốn làm là: mở inputStream của một tệp lớn, đọc nó theo khối 10MB, tải lên một khối, đọc khối tiếp theo. val chunkCount = Math.ceil(tổng
Tôi không biết hiểu thế nào: { if (inputStream **!= null**) { inputStream.close(); Từ ví dụ đó: public c
Tôi muốn biết liệu inputStream có trống không khi không sử dụng phương thức read(). Có cách nào để biết nó có trống mà không cần đọc không? Câu trả lời hay nhất Không, bạn không thể. inputStream được thiết kế để xử lý các tài nguyên từ xa, vì vậy trước khi thực sự đọc nó
Tôi đã tạo một trình nghe luồng đầu vào bluetooth và chỉ hỏi if(InputStream.isAvailable > 0) để kiểm tra xem có dữ liệu đến không, sau đó tạo một vòng lặp để lưu trữ dữ liệu đến vào int[] cho đến khi không còn nữa và nó hoạt động Hoàn hảo
Đây là luồng mã của tôi, nội dung tệp bị thiếu, tôi nghĩ có thể có vấn đề với dòng IOUtils.toByteArray(), vui lòng hướng dẫn điều gì thực sự đang xảy ra ở đây. Nội dung tệp bị mất: Dòng inputStream = someCl
Tôi bắt đầu với phản hồi của một yêu cầu HTTP: inputStream replyInputStream = reply.getEntityInputStream() Tôi cần gzip phản hồi này
Một người dùng tải một tệp lớn lên trang web của tôi và tôi muốn gzip tệp đó và lưu trữ nó trong một blob. Vì vậy, tôi có một Dòng đầu vào không nén và blob cần một Dòng đầu vào. tôi biết cách sử dụng
Tôi đang gọi một dịch vụ trả về một tệp nén. Tôi đang nhận dữ liệu từ phản hồi dưới dạng inputStream (được cung cấp bởi javax.activation.DataHandler.getInputStream(); ). Điều tôi muốn làm là
Tôi đang cố gắng nén một Dòng đầu vào và trả về một Dòng đầu vào: nén Đầu vào công khai (InputStream in){ // Đọc "trong
Gần đây tôi thấy mã trong Kotlin đọc toàn bộ nội dung của một inputStream thành một chuỗi, ví dụ: // input thuộc loại inputStream val baos = Byte
Tôi đang cố đọc Dòng đầu vào từ IHTTPSession.getInputStream() bằng mã sau đây nhưng mã này luôn đưa ra Ngoại lệ về thời gian chờ cắm. riêng tư
Như đã đề cập trong Cách sử dụng thiết bị chặn Jersey để nhận nội dung yêu cầu, tôi đang sửa đổi EntityInput trong ContainerRequestFilter
Tôi đang viết một ứng dụng cần trao đổi dữ liệu với thiết bị Bluetooth 2.1. Tôi đã làm điều đó nhiều lần, nhưng lần này có điều gì đó kỳ lạ đã xảy ra. Log.d("TAG", "connectToDevice");
Tôi chỉ đang tự hỏi liệu đây là ý tưởng hay hay ý tưởng tồi: inputStreamReader in = new inputStreamReader(socket.getInputStream());
Tôi đang phát triển một ứng dụng Android có Chế độ xem chứa nhiều phòng trưng bày. Nội dung của thư viện (bitmap) có màu đỏ từ Internet. Đối với thư viện đầu tiên, mọi thứ đều hoạt động tốt, nhưng khi cố tải xuống hình ảnh đầu tiên của thư viện thứ hai, Bitm
Trong Dart tôi muốn đọc BMP, vì vậy có thể là tệp LỚN. Tôi làm như thế này: var inputStream = imageFile.openInputStream();
Tôi là một lập trình viên xuất sắc, rất giỏi!