对于我的应用程序,我需要在Android手机上录制来自MIC的音频,并通过TCP将其发送到需要播放的其他Android手机.
我正在使用AudioRecord
和AudioTrack
上课.这适用于文件 - 使用文件将音频写入文件DataOutputStream
,并使用它读取DataInputStream
.
但是,如果我从套接字而不是文件中获取相同的流,并尝试写入它,我会得到一个例外.
我无法理解可能出现的问题.任何帮助将不胜感激.
编辑:即使我尝试使用更大的缓冲区大小(65535字节,160000字节),问题也是一样的.
这是代码:
录音机:
int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
byte[] tempBuffer = new byte[bufferSize];
recordInstance.startRecording();
while (/*isRecording*/) {
bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
dataOutputStreamInstance.write(tempBuffer);
}
Run Code Online (Sandbox Code Playgroud)
上面的DataOutputStream获得如下:
BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff);
Run Code Online (Sandbox Code Playgroud)
请你看看,让我知道我在这里做错了什么?
谢谢,
我还是比较新的插座,我还没有看到有关这个主题的任何信息.
要写入连接的套接字,您可以使用
socket.getOutputStream().write
Run Code Online (Sandbox Code Playgroud)
或者DataOutputStream
从套接字创建一个新的OutputStream
并写入.
我正在尝试使用HttpUrlConnection从Android应用程序发出WebService请求.但有时它会起作用,有时则不起作用.
当我尝试发送此值时:
JSON值
{"Calle":"Calle Pérez 105","DetalleDireccion":"","HoraPartida":"May 18, 2014 9:17:10 AM","Numero":0,"PuntoPartidaLat":18.477295994621315,"PuntoPartidaLon":-69.93638522922993,"Sector":"Main Sector"}
Run Code Online (Sandbox Code Playgroud)
我在DataOutputStream关闭函数中遇到了"意外的流结束"异常.
这是我的代码:
DataOutputStream printout;
// String json;
byte[] bytes;
DataInputStream input;
URL serverUrl = null;
try {
serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
...
}
bytes = json.getBytes();
try {
httpCon = (HttpURLConnection) serverUrl.openConnection();
httpCon.setDoOutput(true);
httpCon.setUseCaches(false);
httpCon.setFixedLengthStreamingMode(bytes.length);
httpCon.setRequestProperty("Authorization", tokenType + " "+ accessToken);
httpCon.setRequestMethod("POST");
httpCon.setRequestProperty("Content-Type", "application/json");
printout = new DataOutputStream(httpCon.getOutputStream());
printout.writeBytes(json);
printout.flush();
printout.close();
...
}
Run Code Online (Sandbox Code Playgroud) 我在一些脚本中乱砍,试图解析Javas编写的一些数据DataOutputStream#writeLong(...)
.由于java似乎总是写大端,我在将字节输入时遇到问题od
.这是因为od
总是假设endianess与你当前所在的arch的endianess匹配,而且我在一个小端机器上.
我正在寻找一个简单的单行程来反转字节顺序.假设你知道文件的最后8个字节是由前面提到的writeLong(...)
方法编写的.我目前打印这篇文章的最佳尝试是
tail -c 8 file | tac | od -t d8
Run Code Online (Sandbox Code Playgroud)
,但tac
似乎只对文本有效(足够公平).我找到了一些引用dd conv=swab
,但这只是成对交换字节,并且不能反转这八个字节.
有谁知道这个好的单行程?
当我尝试使用sax在套接字上解析xml时,我遇到了一个奇怪的现象.经过分析,我注意到DataOutputStream在我的数据前添加了2个字节.
DataOutputStream发送的消息:
0020 50 18 00 20 0f df 00 00 00 9d 3c 3f 78 6d 6c 20 P.. .... ..<?xml
0030 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 3f 3e 3c version= "1.0"?><
0040 63 6f 6d 70 61 6e 79 3e 3c 73 74 61 66 66 3e 3c company> <staff><
0050 66 69 72 73 74 6e 61 6d 65 3e 79 6f 6e 67 3c 2f firstnam e>yong</
0060 …
Run Code Online (Sandbox Code Playgroud) 我在这里遇到了很多问题,我认为这是因为我不太了解如何使用Java提供的API.
我需要写一个int
和byte[]
一个byte[]
我想用a DataOutputStream
来解决数据写入writeInt(int i)
和write(byte[] b)
,并且能够把它放到一个字节数组中,我应该使用ByteArrayOutputStream
方法toByteArray().
我知道这个类使用Wrapper模式,所以我有两个选择:
DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());
Run Code Online (Sandbox Code Playgroud)
要么
ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,我都"松散"了一种方法.在第一种情况下,我无法访问该toByteArray()
方法,而在第二种情况下,我无法访问该writeInt()
方法.
我应该如何一起使用这些课程?
方法中存在一个奇怪的限制java.io.DataOutputStream.writeUTF(String str)
,它将utf-8编码字符串的大小限制为65535
字节:
if (utflen > 65535)
throw new UTFDataFormatException(
"encoded string too long: " + utflen + " bytes");
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为:
static int writeUTF(String str, DataOutput out)
方法可以轻松解决此限制java.io.DataInputStream.readUTF()
.根据上面我无法理解这种限制writeUTF
方法的目的.我错过了什么或误解了什么?
我一直在做一些套接字编程来通过线路传输信息.我遇到了DataOutputStream.writeUTF()的问题.它似乎允许高达64k的字符串,但我有一些情况,我可以跑过这个.是否有任何好的替代方案支持更大的字符串或我需要自己滚动?
我想为我的报告创建一个HTML文件.可以使用创建报告中的内容BufferedWriter#write(String)
File f = new File("source.htm");
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write("Content");
Run Code Online (Sandbox Code Playgroud)
或者通过使用 DataOutputStream#writeBytes(String)
File f = new File("source.htm");
DataOutputStream dosReport = new DataOutputStream(new FileOutputStream(f));
dosReport.wrtiteBytes("Content");
Run Code Online (Sandbox Code Playgroud)
其中一个比另一个好吗?为什么会这样?
我希望我的程序将URL地址(一次一个)保存到文件中.这些地址需要以UTF格式保存,以确保它们是正确的.
我的问题是文件一直被覆盖,而不是附加:
DataOutputStream DOS = new DataOutputStream(new FileOutputStream(filen, true));
Count = 0;
if (LinkToCheck != null) {
System.out.println(System.currentTimeMillis() + " SaveURL_ToRelatedURLS d "+LinkToCheck.Get_SelfRelationValue()+" vs "+Class_Controller.InterestBorder);
if (LinkToCheck.Get_SelfRelationValue() > Class_Controller.InterestBorder) {
DOS.writeUTF(LinkToCheck.Get_URL().toString() + "\n");
Count++;
}
}
DOS.close();
Run Code Online (Sandbox Code Playgroud)
此代码不会附加,所以我该如何追加它?
dataoutputstream ×10
java ×10
android ×2
sockets ×2
append ×1
endianness ×1
java-io ×1
networking ×1
restrictions ×1
string ×1
swap ×1
wrapper ×1