我有一个执行一些 IO 的方法,我想限制对这个方法的调用(每秒),以避免后端获得它无法处理的并发请求的爆发。
如果要求没有“每秒”,我可以只使用一个堆栈(基本上只是一个计数器)并offer()在开始请求时和poll()完成时使用。对于“每秒”要求,我需要以某种方式清除堆栈上比给定时间流逝更旧的插槽。
我该如何正确地做到这一点?显然,该结构应该是线程安全的。
感谢您的时间!
快速设计问题:我需要在我的游戏引擎架构中实现客户端-服务器网络之间的一种通信形式,以便在彼此之间发送事件。
我选择创建事件对象,因此,我想知道序列化这些对象并通过简单套接字网络通过对象流传递它们的效率如何?
也就是说,与创建对象的字符串表示、通过字符流发送字符串以及解析字符串客户端相比,效率如何?
事件将在每个游戏循环中发送,如果不是更多的话;但事件对象本身只是一些 Java 原语的简单包装器。
感谢您的洞察力!
(tl;dr - 网络上的对象流是否有效?)
问题类似于以下两个问题.
但我仍然无法完全理解它.
到目前为止,我认为以下代码中的read()方法将因空文件'test.txt'而阻塞.
FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");
Run Code Online (Sandbox Code Playgroud)
实际上它会打印-1,我想知道为什么.
javadoc说如果还没有输入,则此方法会阻塞.
什么" 没有输入可用 "是什么意思?
谢谢.
我正在尝试执行以下操作
我正在使用我的 Java 应用程序打电话给另一个人(已经完成并且工作正常)。
然后我正在播放录音,例如“请按 1 继续用英语”(已经完成并且工作正常)。
现在我想检测那个人按 1,根据我在谷歌搜索中的研究,我知道这可以使用 DTMF。如果这个人按 1,我想根据我的情况执行操作。
我的问题是如何在 java (J2SE) 中使用 DTMF 检测该数字。我正在使用中兴 USB 加密狗拨打电话。拨号、挂断等控制是通过AT指令+Java IO实现的。
这是我的示例代码,但它没有给出正确的拨号号码及其每次循环。
public class zxczczz extends javax.swing.JFrame {
/**
* Creates new form zxczczz
*/
public zxczczz() {
initComponents();
}
float[] lowFreq = new float[]{697.0F, 770.0F, 852.0F, 941.0F};
float[] highFreq = new float[]{1209.0F, 1336.0F, 1477.0F, 1633.0F};
float[] dtmfTones = new float[]{697.0F, 770.0F, 852.0F, 941.0F, 1209.0F, 1336.0F, 1477.0F, 1633.0F};
int dtmfBoard[][] = {{1, 2, 3, 12}, {4, 5, 6, 13}, {7, 8, …Run Code Online (Sandbox Code Playgroud) 我有一个文件阅读器,它将文件的行作为Object[]. 我正在使用该lines方法。使用起来会更快吗readAllLines?我不将该流用于其他任何用途,但我想currentBookData成为String[]or Object[]。
package input;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ReadFile {
public static Object[] currentBookData;
public static void getBookData(String path) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(path), Charset.defaultCharset())) {
currentBookData = stream.toArray();
}
catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序来从文件夹中读取每个文件,在读取文件中的内容后,该文件应该被删除。我可以编写程序来分别从文件夹中读取文件并从文件夹中删除文件,但无法将它们集成到一个程序中。
我有一个在 java JDK 1.7 下运行的批处理。它在带有 RHEL、2.6.18-308.el5 #1 SMP 的系统上运行。
此过程从数据库中获取元数据对象列表。它从这个元数据中提取文件的路径。该文件可能实际存在,也可能不存在。
该进程使用 ExecutorService ( Executors.newFixedThreadPool()) 来启动多个线程。每个线程都运行一个 Callable,它启动一个进程,该进程读取该文件并在该输入文件存在时写入另一个文件(并记录结果),如果该文件不存在则不执行任何操作(记录该结果除外)。
我发现行为是不确定的。尽管每个文件的实际存在始终不变,但运行此过程并不会给出一致的结果。它通常会给出正确的结果,但偶尔会发现一些确实存在的文件不存在。如果我再次运行相同的过程,它会发现它之前所说的文件不存在。
为什么会发生这种情况,是否有更可靠的替代方法?在其他线程尝试读取目录时在多线程进程中写入文件是否错误?较小的线程池会有所帮助(目前为 30)吗?
更新: 这是在这种情况下工作线程调用的 unix 进程的实际代码:
public int convertOutputFile(String inputFile, String outputFile)
throws IOException
{
List<String> args = new LinkedList<String>();
args.add("sox");
args.add(inputFile);
args.add(outputFile);
args.addAll(2, this.outputArguments);
args.addAll(1, this.inputArguments);
long pStart = System.currentTimeMillis();
int status = -1;
Process soxProcess = new ProcessBuilder(args).start();
try {
// if we don't wait for the process to complete, player won't
// find the converted file.
status = soxProcess.waitFor(); …Run Code Online (Sandbox Code Playgroud) 我在 Windows 中安装了网络驱动器(samba 服务器)。
我在该驱动器中有一个文件,我想在 Java 程序中读取该文件。
在我尝试使用以下方法读取文件之前:
Paths.get(basePath, fileName).toFile()
Run Code Online (Sandbox Code Playgroud)
但由于文件不存在而失败。文件就在那里,路径也很好。
然后我尝试了以下有效的代码:
String path = Paths.get(basePath, fileName).toAbsolutePath().toString()
File file = new File(path)
Run Code Online (Sandbox Code Playgroud)
两种方法有什么区别吗?是否需要任何安全设置?
更新
因此,在我使用第二部分(有效的部分)之后,我回到原来的部分(原样)来验证调试,这次它有效了。我用同一目录中的另一个文件尝试了它,但失败了。看起来很奇怪,但我会检查更多。
java.nio.Files.createSymbolicLink用于创建符号链接。我可以通过 SDK 创建引用链接(类似于cp --reflink=[WHEN]),还是需要执行到底层操作系统?
最初我有以下代码:
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
externalHttpCall(output.toByteArray());
}
Run Code Online (Sandbox Code Playgroud)
在这里我发现有时字节数组没有完全写入。
我知道这是因为在externalHttpCall调用过程中没有刷新流。
为了修复它,我写了以下内容:
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
printer.flush();
log.info("Printer was flushed");
externalHttpCall(output.toByteArray());
}
Run Code Online (Sandbox Code Playgroud)
它解决了这个问题,但在这里我迷失了一个想法,即仅在externalHttpCall. 所以我想出了以下解决方案:
externalHttpCall(convertToByteArray(items);
public byte[] convertToByteArray(List<MyBean> items){
try (var output = new …Run Code Online (Sandbox Code Playgroud) java ×10
java-io ×10
at-command ×1
blocking ×1
dtmf ×1
file ×1
inputstream ×1
io ×1
jdk1.7 ×1
networking ×1
nio ×1