如何从库存OS X系统上的Un*x shell脚本执行HTTP GET?(安装第三方软件不是一种选择,因为这必须在我无法控制的许多不同系统上运行).
例如,如果我在本地启动Mercurial服务器执行hg服务:
... $ hg serve
Run Code Online (Sandbox Code Playgroud)
然后,从具有wget命令的Linux 我做一个wget:
... $ wget http://127.0.0.1:8000
--2010-12-31 22:18:25-- http://127.0.0.1:8000/
Connecting to 127.0.0.1:8000... connected.
HTTP request sent, awaiting response... 200 Script output follows
Length: unspecified [text/html]
Saving to: `index.html
Run Code Online (Sandbox Code Playgroud)
在我发起"hg serve"命令的终端上,我确实可以看到HTTP GET成功了:
127.0.0.1 - - [30/Dec/2010 22:18:17] "GET / HTTP/1.0" 200 -
Run Code Online (Sandbox Code Playgroud)
所以在Linux上,从shell脚本执行HTTP GET的一种方法是使用wget(如果当然安装了该命令).
有什么其他方法可以做相当于一个wget?特别是我正在寻找可以在OS X安装上运行的东西.
假如您执行e.printStackTrace(),则会捕获异常并在标准输出(例如,控制台)上获取以下内容:
java.io.FileNotFoundException: so.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
Run Code Online (Sandbox Code Playgroud)
现在我想把它发送到一个记录器,比如log4j,以获得以下内容:
31947 [AWT-EventQueue-0] ERROR Java.io.FileNotFoundException: so.txt
32204 [AWT-EventQueue-0] ERROR at java.io.FileInputStream.<init>(FileInputStream.java)
32235 [AWT-EventQueue-0] ERROR at ExTest.readMyFile(ExTest.java:19)
32370 [AWT-EventQueue-0] ERROR at ExTest.main(ExTest.java:7)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读并重新阅读了Java Concurrency in Practice,我已经阅读了几个关于这个主题的线程,我已经阅读了IBM文章处理InterruptedException但是有些东西我根本没有抓到我认为可以打破的东西分为两个问题:
如果我自己永远不会打断其他线程,那么什么可以触发InterruptedException?
如果我从未使用interrupt()中断其他线程(因为我正在使用其他方法来取消我的工作线程,比如毒丸和while(!取消)样式循环[如JCIP中所解释的那样]),那么InterruptedException是什么意思?抓到一个我该怎么办?关闭我的应用程序?
以下是事实:
语言Go有一个垃圾收集器.
Java有一个垃圾收集
很多Java程序都有(细微的或没有)内存泄漏
作为一个有内存泄漏的Java程序的例子(不是为了胆小的人,这个问题可能会动摇你的信念),请看这里有一个叫做Tomcat的小程序,它甚至有一个"查找泄漏"按钮:有没有办法为了避免Tomcat中的部署内存泄漏?
所以我想知道:用Go编写的程序是否会出现与Java编写的某些程序相同的(细微的或不存在的)内存泄漏?
我正在开发一个高性能的Android应用程序(游戏),尽管我首先尝试编写可读性代码,但我想在脑海中留下一个关于幕后发生的事情的图片.使用C++,我已经对编译器将为我做什么和不做什么做了很好的直觉.我正在尝试为Java/Android做同样的事情.
因此这个问题.我在网上找不到这个话题.Java编译器,Dalvik转换器(dx)和/或JITter(在Android 2.2+上)是否会执行如下优化?
方法内联.在什么条件下?private方法总是可以安全地内联; 这样做会吗?public final方法怎么样?关于其他类对象的方法?static方法?如果编译器可以轻松推导出对象的运行时类型,该怎么办?我要声明的方法final或static在可能的情况?
常见的子表达式消除.例如,如果我访问someObject.someField两次,查找只会进行一次吗?如果它是对吸气剂的召唤怎么办?如果我使用一些算术表达式两次会怎么样 它只会被评估一次吗?如果我使用某些表达式的结果,我知道它的值不会改变,作为for循环的上限,该怎么办?
检查数组查找的边界.工具链是否会在某些条件下消除这种情况,例如原型for循环?
价值内联.访问一些public static final int总是内联?即使他们在另一个班级?即使他们在另一个包裹?
分支预测.这甚至有多大问题?是否会在典型的Android设备上大幅提升性能?
简单算术.将someInt * 2被取代someInt << 1?
诸如此类......
以下编译正常:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)
但这不是:
String s = new String();
System.out.println(s instanceof Cloneable);
Run Code Online (Sandbox Code Playgroud)
抛出编译器错误.
问题是什么?
我收到一个找到本地文件的URL(我收到的URL不在我的控制范围内).URL按RFC2396中的定义进行有效转义.如何将其转换为Java File对象?
有趣的是,URL getFile()方法返回一个String,而不是File.
我已经创建了一个名为"/ tmp/some dir"的目录(在"some"和"dir"之间有一个间距字符),它通过以下URL正确定位:"file:/// tmp/some%20dir" (为清楚起见,添加了引号).
如何将该URL转换为Java文件?
要提供有关我的问题的更多详细信息,以下打印为false:
URL url = new URL( "file:///tmp/some%20dir" );
File f = new File( url.getFile() );
System.out.println( "Does dir exist? " + f.exists() );
Run Code Online (Sandbox Code Playgroud)
而以下(用空格手动替换"%20")打印为true:
URL url = new URL( "file:///tmp/some%20dir" );
File f = new File( url.getFile().replaceAll( "%20", " " ) );
System.out.println( "Does dir exist? " + f.exists() );
Run Code Online (Sandbox Code Playgroud)
请注意,我不是在问为什么第一个示例打印为false,为什么使用我的hacky replaceAll的第二个示例打印为true,我问如何将转义的URL转换为Java File对象.
编辑:谢谢大家,这几乎是一个骗局但不完全.
愚蠢的是我在URL类本身中寻找一个帮助方法.
以下按预期从Java URL获取Java文件:
URL url = new URL( "file:///home/nonet/some%20dir" ); …Run Code Online (Sandbox Code Playgroud) (请注意,这个问题不是关于CAS,而是关于"可能是虚假失败的" Javadoc).
从上述两种方法之间的Javadoc唯一不同的AtomicInteger类就是weakCompareAndSet包含批注:"可能意外失败".
现在,除非我的眼睛受到某些咒语的欺骗,否则这两种方法看起来都是完全一样的:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
/* ...
* May fail spuriously.
*/
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Run Code Online (Sandbox Code Playgroud)
所以我意识到"May"并不意味着"必须",但为什么我们都不开始将它添加到我们的代码库中:
public void doIt() {
a();
}
/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}
Run Code Online (Sandbox Code Playgroud)
我真的很困惑那个看起来与compareAndSet()相同的weakCompareAndSet(),但是"可能会失败",而另一个则不能.
显然,"弱"和"伪故障"是相关的方式来"之前发生"的排序,但我还是通过这两个的AtomicInteger(和AtomicLong的等)方法很困惑:因为很明显他们称完全一样不安全.compareAndSwapInt方法.
我之所以特别迷茫AtomicIntegerJava 1.5中得到了介绍,所以Java内存模型变化后(所以它显然不是东西,可以"在1.4意外失败" …
重要编辑我知道在发生两个赋值的线程中 "发生在之前" 我的问题是,另一个线程是否可能读取"b"非空,而"a"仍为空.所以我知道如果你从与之前调用setBothNonNull(...)的线程相同的线程调用doIt(),那么它就不能抛出NullPointerException.但是如果一个人从另一个线程调用doIt()而不是调用setBothNonNull(...)的那个呢?
请注意,这个问题仅仅是对volatile关键字和volatile保证:这是不是对synchronized关键字(所以请不要回答"您必须使用同步"因为我没有任何问题要解决:我只是想了解volatile担保关于无序执行(或缺乏保证).
假设我们有一个包含两个volatileString引用的对象,它们被构造函数初始化为null,并且我们只有一种方法来修改两个String:通过调用setBoth(...)并且我们之后只能将它们的引用设置为非null引用(只允许构造函数将它们设置为null).
例如(这只是一个例子,毫无疑问):
public class SO {
private volatile String a;
private volatile String b;
public SO() {
a = null;
b = null;
}
public void setBothNonNull( @NotNull final String one, @NotNull final String two ) {
a = one;
b = two;
}
public String getA() …Run Code Online (Sandbox Code Playgroud) 在Java的String类中,trim方法包含:
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
Run Code Online (Sandbox Code Playgroud)
我对评论"避免getfield操作码"感到有些困惑......
这是什么意思?(我认为这可以避免在字节码中使用getfield,但为什么这是一个Good Thing [TM]?)
难道是防止万一对象创建微调不会做任何事情(因此该返回)或?
java ×9
android ×1
bytecode ×1
cloneable ×1
concurrency ×1
dalvik ×1
escaping ×1
exception ×1
file ×1
go ×1
http-get ×1
instanceof ×1
javadoc ×1
log4j ×1
logging ×1
macos ×1
memory-leaks ×1
opcode ×1
optimization ×1
shell ×1
stack-trace ×1
unix ×1
url ×1
volatile ×1