我必须制作一个 jar 来点击 API 来获取人员详细信息列表,该列表基本上有四个字段:id、name、salary、department。
我正在使用 apache httpclient 执行 get 请求,该请求在点击 API 时为我提供了 httpentity。
httpentity提供了一个获取response内容的方法,但它返回的是inputstream。
在通过 inputreader 读取此输入流并将其打印出来时,我确认它为我提供了人员详细信息列表。
但我不知道如何将其转换为人员详细信息列表。
那是 PersonDetails 对象:-
public class PersonDetails {
private UUID id;
private String name;
private String department;
private Integer salary;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String …Run Code Online (Sandbox Code Playgroud) 当我的应用程序通过网络输入流接收数据时,会在主线程上调用相应的streamDelegate。当接收大量数据时,UI 阻塞非常明显。我试图从 a 中触发所有相应的功能
DispatchQueue.global(qos: .whatever).sync()
Run Code Online (Sandbox Code Playgroud)
但尽管
inputStream.schedule(in: .current,forMode: .commonModes)
Run Code Online (Sandbox Code Playgroud)
在该队列中被调用,streamDelegate 仍然在 Main 上被调用?!
从我到现在为止阅读和理解的内容来看,.sync 无论如何都不会帮助我,因为它仍然会阻止 UI,因为它会等待完成,然后再将控制权交还给 UI。所以我对 .async 进行了同样的尝试。当所有流内容都在异步线程上工作时,outputStream 工作正常,但 inputStreams 的streamDelegate 不会触发。我没有收到回复。
我究竟做错了什么?
class AppDelegate {
let mSocketClass = SocketClass()
func application(_:){
DispatchQueue.global(qos: .utility).async(){
mSocketClass.setupNetworkCommunication()
mSocketClass.sendStuff()
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
class SocketClass:NSObject {
var mInputStream: InputStream!
var mOutputStream: OutputStream!
func setupNetworkCommunication(){
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, "example.com" as CFString, 1234, &readStream, &writeStream)
mInputStream = readStream!.takeRetainedValue()
mOutputStream = writeStream!.takeRetainedValue()
mInputStream.schedule(in: .current, forMode: .commonModes) //happens on thread other …Run Code Online (Sandbox Code Playgroud) 我当前的代码需要从Web读取外来字符,目前我的解决方案有效,但速度很慢,因为它使用InputStreamReader读取char字符.无论如何要加快速度并完成工作吗?
// Pull content stream from response
HttpEntity entity = response.getEntity();
InputStream inputStream = entity.getContent();
StringBuilder contents = new StringBuilder();
int ch;
InputStreamReader isr = new InputStreamReader(inputStream, "gb2312");
// FileInputStream file = new InputStream(is);
while( (ch = isr.read()) != -1)
contents.append((char)ch);
String encode = isr.getEncoding();
return contents.toString();
Run Code Online (Sandbox Code Playgroud) 首先考虑这个示例C++代码:
std::string input1, input2, input3;
std::cout << "Enter Input 1: ";
std::cin >> input1;
std::cout << std::endl << "Enter Input 2: ";
std::cin >> input2;
std::cout << std::endl << "Enter Input 3: ";
std::cin >> input3;
Run Code Online (Sandbox Code Playgroud)
如果对于input1,我输入类似"Good day neighbors"的内容,则input1设置为"Good",input2设置为"day",输入3设置为"neighbors".我甚至没有机会为input2和input3设置值.
所以我的问题是:如何在没有它的情况下输入包含空格的文本字符串(缺少更好的术语)分解并溢出到后续的输入流调用中?
提前感谢收到的任何和所有答案.
我想读取一个输入字符串并将其作为UTF8编码的字符串返回.所以我在Oracle/Sun网站上找到了一个使用FileInputStream的示例.我不想读取文件,而是读取字符串,因此我将其更改为StringBufferInputStream并使用下面的代码.方法参数jtext,是一些日文文本.实际上这种方法效果很好.问题是关于已弃用的代码.我不得不放置@SuppressWarnings,因为不推荐使用StringBufferInputStream.我想知道是否有更好的方法来获取字符串输入流?它可以保持原样吗?我花了很长时间试图解决这个问题,我现在不想改变任何东西,我似乎已经破解了它.
@SuppressWarnings("deprecation")
private String readInput(String jtext) {
StringBuffer buffer = new StringBuffer();
try {
StringBufferInputStream sbis = new StringBufferInputStream (jtext);
InputStreamReader isr = new InputStreamReader(sbis,
"UTF8");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}
in.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我想我找到了一个解决方案 - 各种各样:
private String readInput(String jtext) {
String n;
try {
n = new String(jtext.getBytes("8859_1"));
return n;
} catch (UnsupportedEncodingException e) { …Run Code Online (Sandbox Code Playgroud) 与Apache共享它是非常简单转换InputStream到byte[],
static byte[] toByteArray(InputStream input)
但我找不到相反的方法.将字节数组转换为InputStream对象的最流行/最直接的方法是什么?
提前致谢.
例如,我有以下java代码:
URL u = new URL("http://google.com");
URLConnection c = u.openConnection();
InputStream s = c.getInputStream();
int i;
while ((i = s.read()) != -1) {
//do something here
}
Run Code Online (Sandbox Code Playgroud)
我无法理解,在哪个时刻(在方法调用之后)java将实际请求发送到服务器?
我有一个奇怪的程序,GzipInputStream零填充缓冲区的一部分.我有幸知道流中的字节应该是什么样的,我可以看到缓冲区正在填充8个正确的字节和12个零(不应该为零)
BYTES应该看起来像这样----> 0 20 82 22 -91 27 -96 65 66 65 88 32 32 32 32 81 32 0 0 0 100 78
BYTES实际上看起来像这样---> 0 20 82 22 -91 27 -96 65 66 65 0 0 0 0 0 0 0 0 0 0 0 0
前两个字节表示一个整数,用于确定前两个字节之后的可变长度(以字节为单位)的大小.所以在这个例子中,第一个字节是0 20,而在BIG_ENDIAN中,这给我们后续的有效载荷大小为20个字节.
这是我的阅读代码
gzipInputStream = new GZIPInputStream(url.openStream());
byte[] payload = new byte[2];
gzipInputStream.read(payload);
for(int i=0;i<payload.length;i++){
System.out.println(payload[i]);
}
int payloadSize = ((payload[0] & 0xFF) << 8) | ((payload[1]) & 0xFF);
//read the next payloadSize …Run Code Online (Sandbox Code Playgroud) 我只是用
IOUtils.copy(myInputStream, myOutputStream);
Run Code Online (Sandbox Code Playgroud)
我在调用IOUtils.copy之前看到输入流可以读取而不是之后.
flux.available()
(int) 1368181 (before)
(int) 0 (after)
Run Code Online (Sandbox Code Playgroud)
我看到了这方面的一些解释后,我看我可以复制 bytes从我InputStream的ByteArrayInputStream,然后用mark(0)和read(),以多次读取的输入流.
这是得到的代码(正在运行).我发现这段代码非常冗长,如果有更好的解决方案,我想要这样做.
ByteArrayInputStream fluxResetable = new ByteArrayInputStream(IOUtils.toByteArray(myInputStream));
fluxResetable.mark(0);
IOUtils.copy(fluxResetable, myOutputStream);
fluxResetable.reset();
Run Code Online (Sandbox Code Playgroud) 我发现了几个类似的问题,但我仍然无法找到问题的答案.
我知道关闭外部流就足够了,它会关闭在线创建的内部流.
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
br.close();
Run Code Online (Sandbox Code Playgroud)
考虑下一个例子
Properties props = new Properties();
props.load(new FileInputStream(configPath));
Run Code Online (Sandbox Code Playgroud)
是应该将FileInputStream其分配给变量然后显式关闭(或者使用try-with-resource构造),还是Java GC会在props.load()方法调用之后立即自动关闭它,因为没有对资源的引用?